ð§ ã«ã¬ãŒã«äŸããªããåŠã¶MCPã®æŠèŠ
ãªã«ãã
æè¿å··ã§ãMCPã£ãŠèããŸããããç§ãããããããŒããŽããŒïŒïŒãã£ãŠæãã§ããã
ä»åã¯MCPã®å
¬åŒããã¥ã¡ã³ããèªãã§ãMCPãã©ã®ãããªãã®ãªã®ããã©ã®ãããªèšèšãªã®ããçè§£ããåå¿é²ãèŒããŸãã
å
¬åŒããã¥ã¡ã³ã: https://modelcontextprotocol.io/introduction
MCPã®åºæ¬ãããããã³ããã»ããŒã«ã»ãªãœãŒã¹ã»éä¿¡ïŒTransportïŒã«ã€ããŠãåé ç®ã®åŒã³åºãæ¹æ³ããã®åäœã解説ããŠãããŸãã
ããããèªã¿ãªãããããããªããšãªã£ããšããã¯ãã«ã¬ãŒã«äŸããªããåè«ã£ãœã解説ããŠããŸãã(ã«ã¬ãŒã«äŸããã®ã¯AIããã£ãŠãããŸãã)
ð° MCPã£ãŠãªã«ïŒ
MCPïŒModel Context ProtocolïŒã¯ãAIïŒäž»ã«LLMïŒãšã¢ããªã±ãŒã·ã§ã³ãã€ãªã**å ±éã®ãããšãæ¹æ³ïŒãããã³ã«ïŒ**ã§ãã
å ¬åŒã§ããUSB-Cã®ããã«ãã©ã®AIã§ãåã圢ã®å ¥åºåã«ããããšã§GitHubãSlackãªã©æ§ã ãªããŒã«ãããŒã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ããããšããŠäŸããããŠããŸãã
ã«ã¬ãŒã«äŸãããšâŠ
MCPã¯ãã«ã¬ãŒäœãã®ããã®çµ±äžã¬ã·ãã®ãããªãã®ã§ããç°ãªããããã³ïŒAIãå®è¡å¯Ÿè±¡ïŒã§ããåãã¬ã·ãã«æ²¿ã£ãŠèª¿çããããšã§ã誰ã§ãçŸå³ããã«ã¬ãŒïŒé©åãªæ©èœãããŒã¿ïŒãäœããããã«ãªããŸãã
ð§© MCPã®åºæ¬æ§é ïŒã¢ãŒããã¯ãã£ïŒ
- Host: AIããŒã«ïŒäŸ: Claude DesktopïŒ
- Client: Hostå ã§ãµãŒããŒãšã€ãªããMCPã¯ã©ã€ã¢ã³ã
- Server: ããŒã¿ã»ããŒã«ã»ããã³ãããªã©ãæäŸããåŠçåŽ
é信㯠JSON-RPC 2.0 ã䜿ããrequest â response ãŸã㯠notification ã®åœ¢ã§è¡ãããŸãã
åŒã³åºãæ¹æ³: åã³ã³ããŒãã³ãã¯ã決ãããããšã³ããã€ã³ãïŒäŸ: resources/listãtools/call ãªã©ïŒãçšããŠçžäºã«ã¡ãã»ãŒãžããããšãããŸãã
ð§âð³ å®éã®äœ¿ãæ¹
- Claudeãªã©ã®AIããã¯ã©ã€ã¢ã³ããã«ãªããããã¯ãšã³ãã§åããŠãããµãŒããŒã«MCPãéããŠããã®ãã¡ã€ã«èªãã§ïŒããAPIå©ããŠïŒããšãé¡ãããä»çµã¿ã§ãã
ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®åœ¢ã®åºæ¬
MCPã§ã¯ãJSON-RPC圢åŒã§ã¯ã©ã€ã¢ã³ããšãµãŒããŒããããšãããŸãã
ãªã¯ãšã¹ãã®åœ¢
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/list"
}
ã¬ã¹ãã³ã¹ã®åœ¢
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resources": [
{
"uri": "file:///logs/app.log",
"name": "Application Logs",
"mimeType": "text/plain"
}
]
}
}
ããã¯ãå©çšå¯èœãªãªãœãŒã¹ãäžèЧã§ååŸãããæµãã®äžäŸã§ããåºæ¬çã«ãã©ã®æ©èœã§ããã®åœ¢ïŒmethodåãéãã ãïŒã«ãªããŸãã
ð ResourcesïŒãªãœãŒã¹ïŒ
AIã«èŠãããããŒã¿ããã¡ã€ã«ã®ããšããã°ãã³ãŒããèšå®ãã¡ã€ã«ãªã©ã
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
- äžèЧååŸ: ãµãŒããŒã
resources/list
ã§å©çšå¯èœãªãªãœãŒã¹ã®äžèЧãæäŸ - äžèº«ã®ååŸ: ã¯ã©ã€ã¢ã³ãã
resources/read
ã§åã ã®ãªãœãŒã¹ã®å 容ãèªã¿åºã - æŽæ°éç¥: å¿ èŠã«å¿ããŠããªã¢ã«ã¿ã€ã ã§æŽæ°ã®éç¥ãè¡ããã
{
"uri": "file:///logs/app.log",
"name": "Application Logs",
"mimeType": "text/plain"
}
ã«ã¬ãŒã«äŸãããšâŠ
- Resourcesã¯ãã«ã¬ãŒäœãã«ããã飿ã§ãã
-
resources/list
ã¯ãå·èµåº«ã«ããå šé£æããã§ãã¯ããäœæ¥ã -
resources/read
ã¯ãå ·äœçãªææïŒæ°é®®ãªéèãèãã¹ãã€ã¹ãªã©ïŒãåãåºããŠç¶æ ã確èªããåäœã«çžåœããŸãã
äŸ
ãªã¯ãšã¹ãã®åœ¢
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/list"
}
ã¬ã¹ãã³ã¹ã®åœ¢
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resources": [
{
"uri": "file:///logs/app.log",
"name": "Application Logs",
"mimeType": "text/plain"
}
]
}
}
ð§âð³ å®éã®äœ¿ãæ¹
- Claudeã§ããã®ãããžã§ã¯ãã®ãã°ãã¡ã€ã«èŠããŠããšèšããšãè£ã§
resources/read
ãåŒã°ããŠãã°ãã¡ã€ã«ãåã蟌ãŸããŸãã
ããã«ãããæ©å¯æ å ±ãªã©ãAIã«æµããããšãªãããããŸã§å®è¡ã¯ããã¯ãšã³ããµãŒããŒãšãªããå®å šãªå®è¡ãã§ããããšããã®ãMCPã®åŒ·ã¿ã§ãã
ð§ PromptsïŒããã³ããïŒ
䜿ããŸããã質åãã³ãã¬ãŒããæ±ºãŸã£ãç®çã§AIã«è©±ããããããã®å®çŸ©ã
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
{
"name": "git-commit",
"arguments": [
{ "name": "changes", "required": true }
]
}
- ãµãŒããŒãããã³ãããå®çŸ©ããã¯ã©ã€ã¢ã³ãã¯
prompts/list
ã§äžèЧãååŸ - å¿
èŠãªããã³ããã¯
prompts/get
ã䜿ã£ãŠåŒã³åºããå©çšããŸã
ã«ã¬ãŒã«äŸãããšâŠ
Promptsã¯ãã«ã¬ãŒäœãã®ã¬ã·ãã«ãŒãã§ãã
- ã©ã®ã¹ãã€ã¹ããã€æå ¥ããããã©ããªæé ã§èª¿çããããæ±ºãŸã£ãŠãããå®å®ããå³ãåºãããã®å®åæé ã瀺ããŸãã
- 決ãŸã£ãç®çã®ããã®ã質åãã³ãã¬ãŒãããšããŠãæ¯ååãã¬ã·ããåçŸã§ããç¹ãé åã§ãã
äŸ
ðš ãªã¯ãšã¹ãäŸïŒããã³ããååŸïŒ:
{
"jsonrpc": "2.0",
"id": 2,
"method": "prompts/get",
"params": {
"name": "git-commit",
"arguments": {
"changes": "add login feature"
}
}
}
ð© ã¬ã¹ãã³ã¹äŸ:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "Generate a Git commit message for these changes:\n\nadd login feature"
}
}
]
}
}
ð§âð³ å®éã®äœ¿ãæ¹
- Claudeã§ãGitã®ã³ãããã¡ãã»ãŒãžãäœã£ãŠããšèšããšã
git-commit
ããã³ãããåŒã°ãããŠãŒã¶ãŒã¯å€æŽç¹ã ãæž¡ãã°AIãæãçµã¿ç«ãŠãŠãããŸãã
ð ToolsïŒããŒã«ïŒ
AIãåŒã³åºãããæ©èœãããåŠçããããšãã°ãèšç®ãAPIåŒã³åºãããã¡ã€ã«ã®ä¿åãªã©ã
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
{
"name": "calculate_sum",
"description": "2ã€ã®æ°åãè¶³ã",
"inputSchema": {
"type": "object",
"properties": {
"a": { "type": "number" },
"b": { "type": "number" }
},
"required": ["a", "b"]
}
}
- ãµãŒããŒãããŒã«ãå®çŸ©ããã¯ã©ã€ã¢ã³ãã¯
tools/list
ã§å©çšå¯èœãªããŒã«äžèЧãååŸ - å®éã®å®è¡ã¯ãAIïŒäŸïŒClaudeïŒã
tools/call
ã䜿çšããŠèªåçã«è¡ããŸãïŒå Žåã«ãã人éã®ç¢ºèªããïŒ
ã«ã¬ãŒã«äŸãããšâŠ
Toolsã¯ãã«ã¬ãŒèª¿çã§äœ¿ã調çåšå
·ãç¹å®ã®èª¿çææ³ã«ããããŸãã
- äŸãšããŠã
calculate_sum
ã¯ãææã®åéãæ£ç¢ºã«æž¬ãããã®èšéã«ããã®ãããªãã®ã§ãã - åããŒã«ã¯ãæçå·¥çšã§ã®ç¹å®äœæ¥ãå¹ççã«è¡ãããã®ãéå ·ããšããŠæ©èœããŸãã
äŸ
ðš ãªã¯ãšã¹ãäŸïŒããŒã«å®è¡ïŒ:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "calculate_sum",
"arguments": {
"a": 5,
"b": 3
}
}
}
ð© ã¬ã¹ãã³ã¹äŸ:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "8"
}
]
}
}
ð§âð³ å®éã®äœ¿ãæ¹
- ClaudeããããŒã«äžèЧãã確èªããŠãå¿ èŠãããã°èªåçã«åŒã³åºããŠåŠçãããŠãããŸãïŒäŸãã°ãåèšãåºããŠããšèšããšãèªåã§sumããŒã«ã䜿ããŸãïŒã
ð£ SamplingïŒãµã³ããªã³ã°ïŒ
ãµãŒããŒããAIãžåãåããããªã¯ãšã¹ã
ãã®æ©èœã¯ããµãŒããŒãAIã«æèŠãæ±ãããããã£ãŒãããã¯ãåŸãããã«å©çšãããŸãã
ãã¹ãããããïŒã©ããããããïŒãšãã§ããã
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
-
ãªã¯ãšã¹ãã®æºå
- ã¯ã©ã€ã¢ã³ãåŽã¯ã
sampling/createMessage
ã¡ãœããã䜿ã£ãŠãAIã«éãã¡ãã»ãŒãžãæºåããŸãã - ã¡ãã»ãŒãžå 容ã«ã¯ãããšãã°ãæ±äº¬ã®å€©æ°ã¯ïŒããªã©ããŠãŒã¶ãŒããã®è³ªåããã£ãŒãããã¯äŸé Œãå«ãŸããŸãã
- ã¯ã©ã€ã¢ã³ãåŽã¯ã
-
åŒã³åºãã®äŸ
{
"method": "sampling/createMessage",
"params": {
"messages": [
{ "role": "user", "content": { "type": "text", "text": "What's the weather in Tokyo?" } }
],
"maxTokens": 100
}
}
ã«ã¬ãŒã«äŸãããšâŠ
- ã¬ã·ãã®ç¢ºèª: ã·ã§ãïŒã¯ã©ã€ã¢ã³ãïŒãããã®ã¬ã·ãïŒè³ªåå 容ïŒã§èª¿çãããããšç¢ºèªããŸãã
- 調çéå§: 質åãå ã«ãã·ã§ããæçïŒAIã®è¿çïŒãäœãå§ããŸãã
- 詊é£ãšæäŸ: åºæ¥äžãã£ãæçã詊é£ïŒAIã®å¿ç確èªïŒããæçµçã«ã客ããïŒãµãŒããŒïŒã«æäŸããã
äŸ
ðš ãªã¯ãšã¹ãäŸïŒãµã³ããªã³ã°å®è¡ïŒ:
{
"jsonrpc": "2.0",
"id": 4,
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "How can I improve this code?"
}
}
],
"maxTokens": 100
}
}
ð© ã¬ã¹ãã³ã¹äŸ:
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"model": "claude-3-sonnet",
"role": "assistant",
"content": {
"type": "text",
"text": "You can improve this code by adding error handling and comments."
}
}
}
ð§âð³ å®éã®äœ¿ãæ¹
- ãµãŒããŒããClaudeã«ããã©ããªã®ããšéããšãClaudeãããã«å¯Ÿãã解決çãªã©ãè¿äºãè¿ããŠãããŸãã
ð RootsïŒã«ãŒãïŒ
ãããåºæ¬ã«åç §ããŠãããšãããµãŒããŒãžã®ç¯å²æå®
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
{
"roots": [
{ "uri": "file:///my/project", "name": "ãããžã§ã¯ããã©ã«ã" }
]
}
- ã¯ã©ã€ã¢ã³ãã¯æ¥ç¶æã«ãæäœã®å¯Ÿè±¡ãšãªããã£ã¬ã¯ããªããããžã§ã¯ããã©ã«ããã
roots
ãã©ã¡ãŒã¿ã§ãµãŒããŒã«äŒããŸãã - ãµãŒããŒã¯ãã®ç¯å²å ã®ãªãœãŒã¹ãåŠçã«éå®ããŠåäœããŸãã
ã«ã¬ãŒã«äŸãããšâŠ
Rootsã¯ãã«ã¬ãŒã®ããŒã¹ãšãªãã¹ãŒããåºæ±ã®ãããªãã®ã§ãã
- ã©ã®å ·æã䜿ãããã©ã®ç¯å²ã®é£æã§èª¿çããããæ±ºããéèŠãªåºæºãšãªããŸãã
äŸ
ðš ãªã¯ãšã¹ãäŸïŒæ¥ç¶æã«æç€ºããïŒ:
{
"jsonrpc": "2.0",
"id": 5,
"method": "initialize",
"params": {
"roots": [
{
"uri": "file:///home/user/project",
"name": "My Project"
}
]
}
}
ð© ã¬ã¹ãã³ã¹äŸ:
{
"jsonrpc": "2.0",
"id": 5,
"result": {
"status": "ok"
}
}
ð§âð³ å®éã®äœ¿ãæ¹
- Claude Desktopã§ããã®ãã©ã«ãå ã®ãããžã§ã¯ãã«éäžããŠïŒããšããæå®ããããšããããrootã«ãªããŸãã
ð¡ TransportsïŒéä¿¡æ¹æ³ïŒ
MCPã¯ã©ã€ã¢ã³ããšãµãŒããŒããã©ãã€ãªãããããæ±ºããæ¹æ³
ð äœ¿ãæ¹ãšåŒã³åºãæ¹æ³
-
stdio
: ã¿ãŒããã«ã§ã®ããŒã«ã«å®è¡åã -
SSE
: HTTPçµç±ã§Webãšããåããã
ð ãŸãšã
æ©èœ | å 容 | 誰ãæäœïŒ | ã«ã¬ãŒã«äŸãããšâŠ |
---|---|---|---|
Resources | ãã¡ã€ã«ãããŒã¿ | ãŠãŒã¶ãŒéžæ | ææïŒéèãèãã¹ãã€ã¹ïŒã®æºå |
Prompts | AIã«éããã³ãã¬ãŒã | ãŠãŒã¶ãŒéžæ | ã¬ã·ãã«ãŒãïŒèª¿çæé ïŒã®æç€º |
Tools | å®è¡åŠçã»API | ClaudeãèªåéžæïŒå Žåã«ãã人éã®ç¢ºèªããïŒ | 調çåšå ·ãç¹å®ã®èª¿çææ³ã«ããäœæ¥ã®å®è¡ |
Sampling | ãµãŒããŒâAIãžã®è³ªå | ãµãŒããŒçºä¿¡ã»ã¯ã©ã€ã¢ã³ãèš±å¯ | 詊é£ã«ããå³ã®ãã§ãã¯ãšèª¿æŽ |
Roots | äœæ¥ç¯å²æå® | ã¯ã©ã€ã¢ã³ããæç€º | 䜿çšããäž»èŠé£æãã¹ãŒãã®ããŒã¹ïŒèª¿çç¯å²ã®æ±ºå®ïŒ |
Transports | éä¿¡çµè·¯ | å®è£ æã«æ±ºå® | ã«ã¬ãŒã®æäŸæ¹æ³ïŒå®¶åºçšãå® é ãªã©ã®é éææ®µïŒã®éžæ |
æåŸã«
ãã®èšäºãéããŠMCPã®æŠèŠããªããšãªãã§ãäŒãã£ãŠãçè§£ã®å©ãã«ãªã£ããããããã§ãã
ãããŸã§èªãã§ãã ãã£ãŠããããšãããããŸããïŒ
æ¹åææ¡ã³ã¡ã³ãã»ææ³çããããããããåŸ
ã¡ããŠããŸãïŒ
Discussion