ð€ GhostWriter AI 代çã·ã¹ãã - Phase 5 MCPå®å šçµ±åç
LocalAbout ð€ GhostWriter AI 代çã·ã¹ãã - Phase 5 MCPå®å šçµ±åç
GhostWriter AI generates diary entries for Slack users by analyzing their Slack activity and esa posts, while drawing on their writing style. It dynamically discovers and runs MCP tools, with AI-directed recovery and automatic quality checks.
Key features
- 01Analyze Slack activity and esa posts
- 02Generate diaries in a user's writing style
- 03Discover and invoke MCP tools dynamically
- 04Choose fallback actions after failures
- 05Check diary structure and content quality
Use cases
- 01Create a diary from recent Slack activity
- 02Learn a writing style from esa posts
- 03Generate a recap with Slack's /ghostwrite command
MCP support
The system uses MCP to discover and run data-collection tools dynamically, gathering data from Slack and esa. AI selects tools and determines fallback actions when failures occur.
Configuration
Local server config is the same for every client. Copy it into your clientâs MCP config file.
We havenât collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEGhostWriter AI代çã·ã¹ãã
Slackçµ±åã»esaèšäºçµ±åãšMCP (Model Context Protocol) ãæŽ»çšããAIå®å šèªåŸæ¥èšçæã·ã¹ãã
æŠèŠ
GhostWriterã¯ããŠãŒã¶ãŒã®Slack掻åãšesaèšäºå±¥æŽãåæããåäººã®æäœãæš¡å£ããæ¥èšãèªåçæããã·ã¹ãã ã§ããAIãå¿ èŠãªMCPããŒã«ãåçã«çºèŠã»æŽ»çšããŠã人éã®ä»å ¥ãªãã§é«åè³ªãªæ¥èšãçæããå®å šèªåŸå®è¡ã·ã¹ãã ãæäŸããŠããŸãã
ð¯ äž»èŠæ©èœ
ð å®å šAIèªåŸå®è¡ã·ã¹ãã
- AIèªåŸå€æ: AIãå¿ èŠãªããŒã¿åéããæ¥èšçæãŸã§å šããã»ã¹ãèªåŸå®è¡
- åçMCPããŒã«çºèŠ: å®è¡æã«MCPããŒã«ãèªåçºèŠã»æé©éžæ
- ãšã©ãŒèªåå埩: 倱ææã®ä»£æ¿ææ®µãAIãèªå倿ã»å®è¡
- æ¥æ¬èªååçååŸ: Slack/esaãããªã¢ã«ã¿ã€ã ã§æ£ç¢ºãªæ¥æ¬èªåãååŸ
- åµé ççæ: AI代çèšäºãé€å€ããæäœãã¿ãŒã³ããç¬åµçãªå 容ãçæ
ð€ 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ã§ã®äœ¿çš
- Slackã¯ãŒã¯ã¹ããŒã¹ã«æåŸ ãããBotãããããšã確èª
- ä»»æã®ãã£ã³ãã«ã§ä»¥äžã®ã³ãã³ããå®è¡ïŒ
/ghostwrite
ð¯ çæäŸ (å®å šAIèªåŸå®è¡ã»åµé æ§ä¿èšŒç)
## 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ãéçºç
- ð¥ ããžãã¹ããŒã¯ãŒã: ããŒãã£ã³ã°ããããžã§ã¯ãç
- ææ ããŒã¯ãŒã: æ°æã¡ãææ³ç
Slack ããŒã¿åæ
- ãã£ã³ãã«å¥åæ: etc-spotsåªå ã®æ¥åžžäœéšéèŠ
- 72æéãã£ã«ã¿ãªã³ã°: ææ°æŽ»åã®ã¿ãæœåºã»åæ
- ããŒã¯ãŒãåæ: 4ã«ããŽãª (æ¥åžžäœéšã»æè¡ã»ããžãã¹ã»ææ )
- ææ åæ: 人éãããææ 衚çŸã®æœåº
- ã³ã³ããã¹ãåæ: äœéšã®å ·äœåãšæèçè§£
esaèšäºåæ
- 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
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.