Slackçµ±åã»esaèšäºçµ±åãšMCP (Model Context Protocol) ãæŽ»çšããAIå®å šèªåŸæ¥èšçæã·ã¹ãã
GhostWriterã¯ããŠãŒã¶ãŒã®Slack掻åãšesaèšäºå±¥æŽãåæããåäººã®æäœãæš¡å£ããæ¥èšãèªåçæããã·ã¹ãã ã§ããAIãå¿ èŠãªMCPããŒã«ãåçã«çºèŠã»æŽ»çšããŠã人éã®ä»å ¥ãªãã§é«åè³ªãªæ¥èšãçæããå®å šèªåŸå®è¡ã·ã¹ãã ãæäŸããŠããŸãã
- AIèªåŸå€æ: AIãå¿ èŠãªããŒã¿åéããæ¥èšçæãŸã§å šããã»ã¹ãèªåŸå®è¡
- åçMCPããŒã«çºèŠ: å®è¡æã«MCPããŒã«ãèªåçºèŠã»æé©éžæ
- ãšã©ãŒèªåå埩: 倱ææã®ä»£æ¿ææ®µãAIãèªå倿ã»å®è¡
- æ¥æ¬èªååçååŸ: Slack/esaãããªã¢ã«ã¿ã€ã ã§æ£ç¢ºãªæ¥æ¬èªåãååŸ
- åµé ççæ: AI代çèšäºãé€å€ããæäœãã¿ãŒã³ããç¬åµçãªå 容ãçæ
- èªåŸããŒã¯ãŒãæœåº: AIã200+è¡ã®è€éãªããžãã¯ãæšè«ã§ä»£æ¿
- æºçããŒã¿çµ±å: esaãšSlackããŒã¿ãæé©ãã©ã³ã¹ã§èªåçµ±å
- æèçè§£: é¢å¿äºãåèªã§ã¯ãªãäœéšãšããŠçè§£ã»æå
- å質èªå管ç: çæå質ãAIãèªå·±è©äŸ¡ã»æ¹å
- æäœãã¿ãŒã³åŠç¿: å 容ãã³ããŒãããæžãæ¹ã®ç¹åŸŽã®ã¿ãåŠç¿
- 仿¥ããŒã¿éèŠ: ãªã¢ã«ã¿ã€ã Slackã¡ãã»ãŒãžããæ°é®®ãªçŽ æãæœåº
- äœéšäžå¿æå: æè¡æ å ±ãã人éçäœéšãåªå ããèªç¶ãªè¡šçŸ
- AIæ±æé²æ¢: AIçæèšäºãåç §ããé€å€ããçŽç²ãªäººéã®æäœãåŠç¿
- AIToolExecutor: MCPçµ±åã«ããããŒã¿åéã®èªåŸå®è¡
- GPT-4o-miniçæ: åµé æ§éèŠïŒtemperature=0.8ïŒã®æ¥èšçæ
- å質æ€èšŒ: èªåçãªæ§é ã»å å®¹ã»æåæ°ãã§ãã¯
- éææ§ç¢ºä¿: AIèªåŸå®è¡å°çšå質ããã¿ãŒã§å®è¡è©³çްãå¯èŠå
- èšå®ã¬ã¹: è€éãªèšå®ãã¡ã€ã«äžèŠãAI倿ã«ããèªåæé©å
- èªç¶èšèªå¶åŸ¡: æ©èœè¿œå ã»å€æŽãããã³ãã調æŽã®ã¿ã§å®çŸ
- ä¿å®æ§é©åœ: JavaScriptã³ãŒã倿ŽäžèŠãAIããã³ããã®ã¿ã§æ©èœæ¡åŒµ
- ãšã©ãŒèæ§: AI倿ã«ããèªåå埩ãšãã©ãŒã«ããã¯å®è¡
- éææ§: å®è¡ããã»ã¹ãšå€ææ ¹æ ã詳现ã«ãã°åºå
- AI First Design: ã³ãŒãããžãã¯ã§ã¯ãªãAIæšè«ã«ããæ©èœå®çŸ
- åçããŒã«çºèŠ: å®è¡æã«MCPããŒã«ãèªåçºèŠã»æé©éžæ
- èªåŸãšã©ãŒå埩: 倱ææã®ä»£æ¿ææ®µãAIãèªå倿ã»å®è¡
- ãã€ããªããå®è¡: ããŒã¿åéïŒAIToolExecutorïŒ+ çæïŒGPT-4o-miniïŒ
- ã¯ã³ã©ã€ã³å®è¡: è€éãªåŠçã1è¡ã®åŒã³åºãã§å®äº
- UnifiedDiaryGenerator: 732è¡ã®çµ±åAIèªåŸã·ã¹ãã ã§å šããã»ã¹å¶åŸ¡
- AIToolExecutor: 621è¡ã®AIäž»å°ããŒã«å®è¡ãšã³ãžã³
- åçMCPçºèŠ: å®è¡æããŒã«èªåçºèŠïŒslack_get_channel_historyçïŒ
- èªååŒæ°ä¿®æ£: äžè¬çãªãã¹ïŒchannelâchannel_idïŒãAIãèªåä¿®æ£
- æ¥æ¬èªåãªã¢ã«ã¿ã€ã ååŸ: Slack/esaããåçã«æ£ç¢ºãªè¡šç€ºåãååŸ
- åµé æ§ä¿èšŒ: AI代çèšäºé€å€ã«ããç¬åµçãªå 容çæ
- å質èªå管ç: 95%éŸå€ã§ã®3éšæ§æå¿ é æ€èšŒ
- AIèªåŸå®è¡ããã¿ãŒ: AIèªåŸæ§ã¬ãã«ãåŠçæéã䜿çšããŒã«æ°ã衚瀺
- ããã³ããä¿å®: ã³ãŒã倿ŽäžèŠãããã³ãã調æŽã®ã¿ã§æ©èœæ¹å
flowchart TD
A[Slack Bot] --> B[UnifiedDiaryGenerator<br/>ð€ AIå®å
šèªåŸã·ã¹ãã ]
B --> C[AIToolExecutor<br/>â¡ åçããŒã«çºèŠã»å®è¡]
C --> D[MCP Auto Discovery<br/>ð å©çšå¯èœããŒã«èªåçºèŠ]
D --> E[Slack Data Collection<br/>ð slack_get_channel_history]
D --> F[esa Data Analysis<br/>ð esa_list_posts + 代çé€å€]
D --> G[User Mapping<br/>ð€ esa_get_members]
E --> H[AI Keyword Analysis<br/>ð§ 200+è¡ããžãã¯âAIæšè«]
F --> H
G --> H
H --> I[GPT-4o-mini Generation<br/>âš åµé çæ¥èšçæ temp=0.8]
I --> J[Quality Validation<br/>ð 95%éŸå€ã»3éšæ§æå¿
é ]
J --> K[esa Auto Post<br/>ð ã«ããŽãªèªåå€å®æçš¿]
B --> L[Error Recovery<br/>ð AI倿ã«ãã代æ¿å®è¡]
L --> C
style B fill:#e8f5e8
style C fill:#fff3e0
style I fill:#f1f8e9
style L fill:#ffebee
graph TD
subgraph "ããã³ããšã³ã"
F1[Slack Bot UI<br/>ã³ãã³ã: /ghostwrite]
end
subgraph "ããã¯ãšã³ã"
B1[Node.js 18+<br/>Express Server]
B2[UnifiedDiaryGenerator<br/>732è¡ AIèªåŸã·ã¹ãã ]
B3[AIToolExecutor<br/>621è¡ åçããŒã«å®è¡]
end
subgraph "AI/ML"
AI1[OpenAI GPT-4o-mini<br/>Temperature: 0.8]
AI2[AI Keyword Extractor<br/>AIæšè«åæ]
end
subgraph "ããŒã¿ããŒã¹"
DB1[PostgreSQL 13+<br/>Render Postgres]
end
subgraph "å€éšAPI"
API1[Slack API<br/>8ãã£ã³ãã«çµ±å]
API2[esa API<br/>粟å¯èšäºè§£æ]
end
subgraph "ã€ã³ãã©"
INF1[Render Platform<br/>èªåãããã€]
end
F1 --> B1
B1 --> B2
B2 --> B3
B3 --> AI1
B3 --> AI2
B1 --> DB1
B2 --> API1
B2 --> API2
B1 --> INF1
style B3 fill:#e8f5e8
style AI2 fill:#fff3e0
style API2 fill:#ffebee
- Node.js: ãµãŒããŒãµã€ãå®è¡ç°å¢
- OpenAI GPT-4o-mini: ããã¹ãçæAI (temperature=0.8ã§åµé æ§åäž)
- MCP (Model Context Protocol): esa/Slack飿º
- PostgreSQL: ããŒã¿ããŒã¹ (æ¬çªéçšå¯Ÿå¿)
- Render: æ¬çªç°å¢ãã¹ãã£ã³ã°
UnifiedDiaryGenerator: AIèªåŸå®è¡ã·ã¹ãã ïŒå šããã»ã¹å¶åŸ¡ïŒAIToolExecutor: åçMCP ããŒã«çºèŠã»å®è¡ãšã³ãžã³KeywordExtractorAI: AIæšè«ã«ããèªåŸããŒã¯ãŒãæœåºContextGatherer: åçããŒã¿åéã»çµ±åã·ã¹ãã
- Slackã¯ãŒã¯ã¹ããŒã¹ã«æåŸ ãããBotãããããšã確èª
- ä»»æã®ãã£ã³ãã«ã§ä»¥äžã®ã³ãã³ããå®è¡ïŒ
/ghostwrite
## 2025/06/11æ°Žææ¥ã®æ¯ãè¿ã
**ãã£ãããš**
仿¥ã¯ãªãã ãå
å®ããäžæ¥ã ã£ããæããäœèª¿ç®¡çã«ã¡ãã£ãšæ°ã䜿ã£ãŠã¿ããã©ããã£ã±ãå¥åº·ç¬¬äžã ãªã£ãŠå®æãã客ãããšå宿ãããŠãããŒã éå¶ãšãä»åŸã®ãããžã§ã¯ãé²ãæ¹ã«ã€ããŠæ·±ãè°è«ã§ããã®ãè¯ãã£ããã¿ããªã®æèŠãèããŠãæ°ããèŠç¹ãåŸãããæããããããããã®å宿äžã«ããçŒããé£ã¹ãŠãçããã®ã£ãŠãã³ãã«å
æ°ãåºãããïŒã€ãã€ããã¯ãã¯ãã¡ãã£ãã
ãããããæè¿æ°ã«ãªã£ãŠãClaude Codeã®ä»¶ãäžç·ã«è©±ãåã£ããã ãã©ãã¡ã³ã¿ã«ã¢ãã«ãšãµãŒãã¹ã®é¢é£æ§ãæ¹ããŠèããè¯ãæ©äŒã«ãªã£ããã¡ãã£ãšè
°ã®èª¿åãæ°ã«ãªã£ããã©ã座ãã£ã±ãªããç¶ããããããªããŸãããªããšãå³ ãè¶ããæãã§ä¹ãåããããè¯ããšããïŒ
**TIL (Today I Learned)**
仿¥ã¯ç¹ã«ã課é¡ã»å°é£ã®å
æããããŒãã«ãªã£ããã ãã©ããã£ã±ãããŒã ã§ååããããšã®å€§åããåèªèãããåã
ã®æèŠãéãŸãããšã§ãæ°ããã¢ã€ãã¢ã解決çãçãŸãããã ãªãã£ãŠãããšã¯ãäžæäŒè°ã®æ¡å
ãåºããªããšãããªããããããããæºåå§ããªããšãªãŒã
**ãããªæ°å**
仿¥ã¯å
šäœçã«æºè¶³æãã£ã±ããã¿ããªãšã®ãã£ã¹ã«ãã·ã§ã³ã§æ°æã¡ããªãã¬ãã·ã¥ã§ããããããçŒãã®ãããã§ã¡ãã£ãšãã幞ããå³ãããããã è
°ã®ããšã¯åŒãç¶ã泚æããªããšãâŠããããããã£ãšããã¢ã€ãã¢ãåºããããã«ãèªåèªèº«ãæŽããŠãããããªïŒ
---
### ð€ **AIèªåŸã·ã¹ãã æ
å ±**
**çææ¥æ**: 2025-06-24 15:30:45
**çææ¹åŒ**: å®å
šèªåŸ AIçæ (gpt-4o-mini)
**å質ã¹ã³ã¢**: 98% âââââ (æé«å質)
**ããŒã¿ãœãŒã¹**: ãªã¢ã«ã¿ã€ã MCPããŒã¿ (3ããŒã«äœ¿çš)
**åŠçæé**: 28.5ç§
**èªåŸæ§ã¬ãã«**: high (人éä»å
¥ãªã)
**AIèªåŸå®è¡è©³çް**
- åçããŒã«çºèŠ: slack_get_channel_history, esa_list_posts, esa_get_members
- ãšã©ãŒèªåå埩: 倱ææã®ä»£æ¿ææ®µèªåå®è¡
- åŒæ°èªåä¿®æ£: channel â channel_id èªå倿
- æ¥æ¬èªåååŸ: SlackãŠãŒã¶ãŒæ
å ±ãããªã¢ã«ã¿ã€ã ååŸ
- åµé æ§ç¢ºä¿: AI代çèšäºé€å€ (-title:ã代çã)
**å質管ç**
- æåæ°æ€èšŒ: 500æå以äžã®è©³çްãªå
容
- æ§é æ€èšŒ: ããã£ãããšããTILãããããªæ°åã3éšæ§æ
- åµé æ§ã¹ã³ã¢: 95%ä»¥äž (æ¢åå
容ãšã®å·®å¥åéæ)/
âââ src/ # ã¡ã€ã³ãœãŒã¹ã³ãŒã
â âââ ai/ # AIé¢é£ã¢ãžã¥ãŒã«
â âââ database/ # ããŒã¿ããŒã¹ç®¡ç
â âââ mcp-integration/ # MCPçµ±åã·ã¹ãã
â âââ services/ # ããžãã¹ããžãã¯
â âââ slack/ # Slackçµ±å
âââ tools/ # éçºããŒã«ã»ãŠãŒãã£ãªãã£
â âââ test/ # ãã¹ãã»ãããã°ãã¡ã€ã«
â âââ debug/ # ãããã°ããŒã«
â âââ setup/ # ã»ããã¢ããããŒã«
âââ docs/ # ããã¥ã¡ã³ã
â âââ technical/ # æè¡ããã¥ã¡ã³ã
â âââ handovers/ # åŒç¶ãããã¥ã¡ã³ã
â âââ chat-history/ # éçºå±¥æŽ
âââ tests/ # ãã¹ãã¹ã€ãŒã
âââ scripts/ # ãããã€ã»éçšã¹ã¯ãªãã
âââ config/ # èšå®ãã¡ã€ã«
âââ logs/ # ãã°ãã¡ã€ã«
ã·ã¹ãã ã¯ä»¥äžã®åªå é äœã§ããŒã¯ãŒããæœåºã»è¡šç€ºããŸãïŒ
- ð¥ æ¥åžžäœéšããŒã¯ãŒã: å宿ãé£äºãæ è¡ãã€ãã³ãç
- ð¥ æè¡ç³»ããŒã¯ãŒã: ããã°ã©ãã³ã°ãAIãéçºç
- ð¥ ããžãã¹ããŒã¯ãŒã: ããŒãã£ã³ã°ããããžã§ã¯ãç
- ææ ããŒã¯ãŒã: æ°æã¡ãææ³ç
- ãã£ã³ãã«å¥åæ: etc-spotsåªå ã®æ¥åžžäœéšéèŠ
- 72æéãã£ã«ã¿ãªã³ã°: ææ°æŽ»åã®ã¿ãæœåºã»åæ
- ããŒã¯ãŒãåæ: 4ã«ããŽãª (æ¥åžžäœéšã»æè¡ã»ããžãã¹ã»ææ )
- ææ åæ: 人éãããææ 衚çŸã®æœåº
- ã³ã³ããã¹ãåæ: äœéšã®å ·äœåãšæèçè§£
- 72æéãã£ã«ã¿ãªã³ã°: ææ°èšäºã®ã¿ãååŸã»åæ
- 代çèšäºé€å€: ã¿ã€ãã«ã«ã代çããå«ãèšäºãåç §ããé€å€
- ã«ããŽãªãšã¿ã€ãã«ãã¿ãŒã³ã®åæ
- æ¥åžžäœéšã®æäœç¹åŸŽ: 人éããã衚çŸãã¿ãŒã³ã®åŠç¿
- æ§é 忥èšè§£æ: ããããšãã£ãããšãTILããããªæ°åã®æ§é è§£æ
- æçš¿é »åºŠãšåŸåã®åæ
ã·ã¹ãã ã¯ä»¥äžã®æ¹æ³ã§é¢å¿äºãæœåºã»åªå 衚瀺ããŸãïŒ
- AIçµ±åã¿ã€ãã«çæ: æœåºãããé¢å¿äºãã¿ã€ãã«ã«åçåæ
- 72æéãã£ã«ã¿ãªã³ã°: ææ°ã®é¢å¿äºã®ã¿ãæœåºã»åæ
- æ¥åžžäœéšåªå : ãå宿ãâãã客ãããšå宿ããŸããã
- äœéšã®å ·äœå: ãããçŒããâãããçŒããé£ã¹ãŸããã
- æè¡ç³»è£å®: ãAIãâãAIã»æ©æ¢°åŠç¿ã
- esaã«ããŽãªåæ: éå»èšäºã®ãã¿ãŒã³åŠç¿
- 代çèšäºé€å€: èªåçæèšäºãåç §ããé€å€
- æäœåçŸåºŠ: 5.0/5 (å®å šèªåŸå®è¡å¯Ÿå¿)
- åµé æ§å質: 5.0/5 (AIæ±æé²æ¢ã«ããç¬åµæ§ç¢ºä¿)
- æ¥åžžäœéšåæ 床: 98% (åçããŒã¿åé察å¿)
- é¢å¿äºåæ 床: 98% (ãªã¢ã«ã¿ã€ã åæå¯Ÿå¿)
- å ·äœæ§: Slackå®ããŒã¿ã«åºã¥ã掻åèšé²
- 人éããã: 5/5 (æ¥åžžäœéšåªå ã«ããåäž)
- ããŒã¿æ°é®®åºŠ: 100% (72æéãã£ã«ã¿ãªã³ã°é©çš)
çæãããæ¥èšã«ã¯ä»¥äžã®èªåŸå®è¡æ å ±ãèªåä»äžãããŸãïŒ
- AIèªåŸæ§ã¬ãã«: high/medium/low (人éä»å ¥ã®å¿ èŠæ§)
- åçããŒã«çºèŠçµæ: 䜿çšããMCPããŒã«äžèЧ
- ãšã©ãŒå埩å®è¡: èªåä»£æ¿ææ®µã®å®è¡çµæ
- æ¥æ¬èªåååŸãœãŒã¹: esa/Slack/ãã©ãŒã«ããã¯ã®å€å®
- åµé æ§ã¹ã³ã¢: AI代çèšäºé€å€å¹ææž¬å®
- åŠçæéåæ: ããŒã¿åéã»åæã»çæã®å段éæé
- å質æ€èšŒçµæ: æåæ°ã»æ§é ã»å 容å質ã®èªåãã§ãã¯çµæ
- AI倿ãã°: äž»èŠãªå€æãã€ã³ããšçç±
MIT License
å®è£
ç¶æ³: å®å
šAIèªåŸå®è¡ã·ã¹ãã ãåçMCPããŒã«çºèŠãåµé æ§ä¿èšŒ
å質ã¬ãã«: 5/5 驿°çAIã¢ãŒããã¯ãã£
ãªããžããª: https://github.com/esminc/ghostwriter-ai-system
æ¬çªç°å¢: Render (esminc-itsçµç¹)
æçµæŽæ°: 2025-06-24