क्लाइन्टहरू कस्टम एप्लिकेसन वा स्क्रिप्टहरू हुन् जसले MCP सर्भरसँग सिधै संवाद गरेर स्रोतहरू, उपकरणहरू, र प्रम्प्टहरू अनुरोध गर्छन्। इन्स्पेक्टर टुल प्रयोग गरेर सर्भरसँग अन्तरक्रिया गर्न ग्राफिकल इन्टरफेस प्रदान गर्ने तरिकाभन्दा फरक, आफ्नै क्लाइन्ट लेख्दा प्रोग्रामेटिक र स्वचालित अन्तरक्रियाहरू सम्भव हुन्छ। यसले विकासकर्ताहरूलाई MCP क्षमताहरू आफ्नै कार्यप्रवाहमा एकीकृत गर्न, कार्यहरू स्वचालित गर्न, र विशेष आवश्यकताहरूका लागि कस्टम समाधानहरू निर्माण गर्न सक्षम बनाउँछ।
यो पाठले मोडल कन्टेक्स्ट प्रोटोकल (MCP) इकोसिस्टमभित्र क्लाइन्टहरूको अवधारणालाई परिचय गराउँछ। तपाईंले आफ्नै क्लाइन्ट कसरी लेख्ने र यसलाई MCP सर्भरसँग कसरी जडान गर्ने भन्ने कुरा सिक्नुहुनेछ।
यो पाठको अन्त्यसम्ममा, तपाईंले निम्न गर्न सक्षम हुनुहुनेछ:
- क्लाइन्टले के गर्न सक्छ भन्ने बुझ्ने।
- आफ्नै क्लाइन्ट लेख्ने।
- MCP सर्भरसँग क्लाइन्ट जडान गर्ने र यो अपेक्षाअनुसार काम गर्छ कि गर्दैन भनेर परीक्षण गर्ने।
क्लाइन्ट लेख्नका लागि तपाईंले निम्न कार्यहरू गर्नुपर्नेछ:
- सही लाइब्रेरीहरू आयात गर्नुहोस्। तपाईंले पहिले प्रयोग गरिएको लाइब्रेरी नै प्रयोग गर्नुहुनेछ, तर फरक संरचनाहरू।
- क्लाइन्टको उदाहरण बनाउनुहोस्। यसमा क्लाइन्टको उदाहरण सिर्जना गर्ने र यसलाई रोजिएको ट्रान्सपोर्ट विधिसँग जडान गर्ने समावेश छ।
- सूचीबद्ध गर्न स्रोतहरू चयन गर्नुहोस्। तपाईंको MCP सर्भरमा स्रोतहरू, उपकरणहरू, र प्रम्प्टहरू छन्, तपाईंले कुन सूचीबद्ध गर्ने निर्णय गर्नुपर्नेछ।
- क्लाइन्टलाई होस्ट एप्लिकेसनमा एकीकृत गर्नुहोस्। सर्भरको क्षमताहरू थाहा पाएपछि, तपाईंले यसलाई आफ्नो होस्ट एप्लिकेसनमा एकीकृत गर्नुपर्नेछ ताकि प्रयोगकर्ताले कुनै प्रम्प्ट वा अन्य आदेश टाइप गर्दा, सम्बन्धित सर्भर सुविधा सक्रिय होस्।
अब हामीले उच्च स्तरमा के गर्न गइरहेका छौं भन्ने कुरा बुझिसकेपछि, अब उदाहरण हेर्ने समय आएको छ।
अब हामी एउटा उदाहरण क्लाइन्ट हेरौं:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client(
{
name: "example-client",
version: "1.0.0"
}
);
await client.connect(transport);
// List prompts
const prompts = await client.listPrompts();
// Get a prompt
const prompt = await client.getPrompt({
name: "example-prompt",
arguments: {
arg1: "value"
}
});
// List resources
const resources = await client.listResources();
// Read a resource
const resource = await client.readResource({
uri: "file:///example.txt"
});
// Call a tool
const result = await client.callTool({
name: "example-tool",
arguments: {
arg1: "value"
}
});उपरोक्त कोडमा हामीले:
- लाइब्रेरीहरू आयात गरेका छौं।
- क्लाइन्टको उदाहरण सिर्जना गरेका छौं र stdio प्रयोग गरेर ट्रान्सपोर्टसँग जडान गरेका छौं।
- प्रम्प्टहरू, स्रोतहरू, र उपकरणहरूको सूचीबद्धता गरेका छौं र तिनीहरूलाई सक्रिय गरेका छौं।
यही हो, एउटा क्लाइन्ट जसले MCP सर्भरसँग संवाद गर्न सक्छ।
अब, अर्को अभ्यास खण्डमा, हामी प्रत्येक कोड स्निपेटलाई विस्तारमा व्याख्या गर्नेछौं।
जसरी माथि भनिएको छ, हामी कोड विस्तारमा व्याख्या गर्नेछौं, र तपाईं चाहनुहुन्छ भने कोडसँगै अभ्यास गर्न सक्नुहुन्छ।
हामीलाई आवश्यक लाइब्रेरीहरू आयात गरौं। हामीलाई क्लाइन्ट र रोजिएको ट्रान्सपोर्ट प्रोटोकल stdio को सन्दर्भ चाहिन्छ। stdio स्थानीय मेसिनमा चल्ने चीजहरूको लागि प्रोटोकल हो। SSE अर्को ट्रान्सपोर्ट प्रोटोकल हो जुन हामीले भविष्यका अध्यायहरूमा देखाउनेछौं, तर यो तपाईंको अर्को विकल्प हो। अहिलेका लागि, stdio सँग अगाडि बढौं।
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_clientusing Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol.Transport;जाभाका लागि, तपाईंले अघिल्लो अभ्यासबाट MCP सर्भरसँग जडान गर्ने क्लाइन्ट सिर्जना गर्नुहुनेछ। MCP सर्भरसँग सुरु गर्दै बाट जाभा स्प्रिङ बुट प्रोजेक्ट संरचना प्रयोग गर्दै, SDKClient नामक नयाँ जाभा क्लास src/main/java/com/microsoft/mcp/sample/client/ फोल्डरमा सिर्जना गर्नुहोस् र निम्न आयातहरू थप्नुहोस्:
import java.util.Map;
import org.springframework.web.reactive.function.client.WebClient;
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
import io.modelcontextprotocol.spec.McpClientTransport;
import io.modelcontextprotocol.spec.McpSchema.CallToolRequest;
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
import io.modelcontextprotocol.spec.McpSchema.ListToolsResult;तपाईंले आफ्नो Cargo.toml फाइलमा निम्न निर्भरताहरू थप्नुपर्नेछ।
[package]
name = "calculator-client"
version = "0.1.0"
edition = "2024"
[dependencies]
rmcp = { version = "0.5.0", features = ["client", "transport-child-process"] }
serde_json = "1.0.141"
tokio = { version = "1.46.1", features = ["rt-multi-thread"] }त्यसपछि, तपाईं आफ्नो क्लाइन्ट कोडमा आवश्यक लाइब्रेरीहरू आयात गर्न सक्नुहुन्छ।
use rmcp::{
RmcpError,
model::CallToolRequestParam,
service::ServiceExt,
transport::{ConfigureCommandExt, TokioChildProcess},
};
use tokio::process::Command;अब, उदाहरण बनाउनेतर्फ अगाडि बढौं।
हामीलाई ट्रान्सपोर्टको उदाहरण र हाम्रो क्लाइन्टको उदाहरण सिर्जना गर्नुपर्नेछ:
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client(
{
name: "example-client",
version: "1.0.0"
}
);
await client.connect(transport);उपरोक्त कोडमा हामीले:
-
stdio ट्रान्सपोर्टको उदाहरण सिर्जना गरेका छौं। नोट गर्नुहोस् कि यसले सर्भर कसरी फेला पार्ने र सुरु गर्ने भनेर निर्दिष्ट गर्न आदेश र तर्कहरू निर्दिष्ट गर्दछ, किनभने यो हामीले क्लाइन्ट सिर्जना गर्दा गर्नुपर्ने कुरा हो।
const transport = new StdioClientTransport({ command: "node", args: ["server.js"] });
-
क्लाइन्टलाई नाम र संस्करण दिएर यसको उदाहरण बनाएका छौं।
const client = new Client( { name: "example-client", version: "1.0.0" });
-
क्लाइन्टलाई रोजिएको ट्रान्सपोर्टसँग जडान गरेका छौं।
await client.connect(transport);
from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client
# Create server parameters for stdio connection
server_params = StdioServerParameters(
command="mcp", # Executable
args=["run", "server.py"], # Optional command line arguments
env=None, # Optional environment variables
)
async def run():
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write
) as session:
# Initialize the connection
await session.initialize()
if __name__ == "__main__":
import asyncio
asyncio.run(run())उपरोक्त कोडमा हामीले:
- आवश्यक लाइब्रेरीहरू आयात गरेका छौं।
- सर्भर प्यारामिटरहरूको वस्तु उदाहरण बनाएका छौं, जसलाई हामी सर्भर चलाउन प्रयोग गर्नेछौं ताकि हामी यससँग हाम्रो क्लाइन्ट जडान गर्न सकौं।
runनामक विधि परिभाषित गरेका छौं, जसलेstdio_clientकल गर्छ र क्लाइन्ट सत्र सुरु गर्छ।- प्रवेश बिन्दु सिर्जना गरेका छौं, जहाँ हामी
runविधिलाईasyncio.runमा प्रदान गर्छौं।
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol.Transport;
var builder = Host.CreateApplicationBuilder(args);
builder.Configuration
.AddEnvironmentVariables()
.AddUserSecrets<Program>();
var clientTransport = new StdioClientTransport(new()
{
Name = "Demo Server",
Command = "dotnet",
Arguments = ["run", "--project", "path/to/file.csproj"],
});
await using var mcpClient = await McpClientFactory.CreateAsync(clientTransport);
उपरोक्त कोडमा हामीले:
- आवश्यक लाइब्रेरीहरू आयात गरेका छौं।
- stdio ट्रान्सपोर्ट सिर्जना गरेका छौं र
mcpClientनामक क्लाइन्ट सिर्जना गरेका छौं। यो क्लाइन्टलाई हामी MCP सर्भरमा सुविधाहरू सूचीबद्ध गर्न र सक्रिय गर्न प्रयोग गर्नेछौं।
नोट गर्नुहोस्, "Arguments" मा, तपाईं .csproj वा कार्यान्वयन योग्य फाइल दुवैलाई संकेत गर्न सक्नुहुन्छ।
public class SDKClient {
public static void main(String[] args) {
var transport = new WebFluxSseClientTransport(WebClient.builder().baseUrl("http://localhost:8080"));
new SDKClient(transport).run();
}
private final McpClientTransport transport;
public SDKClient(McpClientTransport transport) {
this.transport = transport;
}
public void run() {
var client = McpClient.sync(this.transport).build();
client.initialize();
// Your client logic goes here
}
}उपरोक्त कोडमा हामीले:
- मुख्य विधि सिर्जना गरेका छौं, जसले
http://localhost:8080मा चल्ने MCP सर्भरमा SSE ट्रान्सपोर्ट सेटअप गर्छ। - ट्रान्सपोर्टलाई कन्स्ट्रक्टर प्यारामिटरको रूपमा लिने क्लाइन्ट क्लास सिर्जना गरेका छौं।
runविधिमा, हामी ट्रान्सपोर्ट प्रयोग गरेर एक समकालिक MCP क्लाइन्ट सिर्जना गर्छौं र जडान सुरु गर्छौं।- SSE (Server-Sent Events) ट्रान्सपोर्ट प्रयोग गरेका छौं, जुन जाभा स्प्रिङ बुट MCP सर्भरसँग HTTP-आधारित संवादका लागि उपयुक्त छ।
यो रस्ट क्लाइन्टले सर्भरलाई "calculator-server" नामक समान डाइरेक्टरीमा रहेको परियोजनाको रूपमा मान्छ। तलको कोडले सर्भर सुरु गर्छ र यससँग जडान गर्छ।
async fn main() -> Result<(), RmcpError> {
// Assume the server is a sibling project named "calculator-server" in the same directory
let server_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.expect("failed to locate workspace root")
.join("calculator-server");
let client = ()
.serve(
TokioChildProcess::new(Command::new("cargo").configure(|cmd| {
cmd.arg("run").current_dir(server_dir);
}))
.map_err(RmcpError::transport_creation::<TokioChildProcess>)?,
)
.await?;
// TODO: Initialize
// TODO: List tools
// TODO: Call add tool with arguments = {"a": 3, "b": 2}
client.cancel().await?;
Ok(())
}अब, हामीसँग एउटा क्लाइन्ट छ, जसले कार्यक्रम चलाउँदा जडान गर्न सक्छ। तर, यसले वास्तवमा यसको सुविधाहरू सूचीबद्ध गर्दैन, त्यसैले अब हामी यो गर्नेछौं:
// List prompts
const prompts = await client.listPrompts();
// List resources
const resources = await client.listResources();
// list tools
const tools = await client.listTools();# List available resources
resources = await session.list_resources()
print("LISTING RESOURCES")
for resource in resources:
print("Resource: ", resource)
# List available tools
tools = await session.list_tools()
print("LISTING TOOLS")
for tool in tools.tools:
print("Tool: ", tool.name)यहाँ हामीले उपलब्ध स्रोतहरू list_resources() र उपकरणहरू list_tools सूचीबद्ध गरेका छौं र तिनीहरूलाई प्रिन्ट गरेका छौं।
foreach (var tool in await client.ListToolsAsync())
{
Console.WriteLine($"{tool.Name} ({tool.Description})");
}
माथिको कोडमा हामीले सर्भरमा रहेका उपकरणहरूको सूचीबद्धता गरेका छौं। प्रत्येक उपकरणका लागि, हामीले यसको नाम प्रिन्ट गरेका छौं।
// List and demonstrate tools
ListToolsResult toolsList = client.listTools();
System.out.println("Available Tools = " + toolsList);
// You can also ping the server to verify connection
client.ping();उपरोक्त कोडमा हामीले:
- MCP सर्भरबाट उपलब्ध सबै उपकरणहरू
listTools()कल गरेर प्राप्त गरेका छौं। - सर्भरसँगको जडान काम गरिरहेको छ कि छैन भनेर जाँच गर्न
ping()प्रयोग गरेका छौं। ListToolsResultले सबै उपकरणहरूको जानकारी समावेश गर्दछ, जस्तै तिनीहरूको नाम, विवरण, र इनपुट स्किमाहरू।
ठीक छ, अब हामीले सबै सुविधाहरू समेटेका छौं। अब प्रश्न यो हो कि हामी तिनीहरूलाई कहिले प्रयोग गर्नेछौं? यो क्लाइन्ट धेरै साधारण छ, साधारण यस अर्थमा कि हामीले सुविधाहरू स्पष्ट रूपमा कल गर्नुपर्नेछ। अर्को अध्यायमा, हामी एउटा उन्नत क्लाइन्ट सिर्जना गर्नेछौं, जसले आफ्नै ठूलो भाषा मोडेल (LLM) पहुँच गर्नेछ। अहिलेका लागि, हामी सर्भरमा सुविधाहरू कसरी सक्रिय गर्ने देखौं:
मुख्य कार्यमा, क्लाइन्ट सुरु गरेपछि, हामी सर्भर सुरु गर्न सक्छौं र यसको केही सुविधाहरू सूचीबद्ध गर्न सक्छौं।
// Initialize
let server_info = client.peer_info();
println!("Server info: {:?}", server_info);
// List tools
let tools = client.list_tools(Default::default()).await?;
println!("Available tools: {:?}", tools);फिचरहरू सक्रिय गर्न, हामीले सही तर्कहरू निर्दिष्ट गर्न र केही अवस्थामा हामीले सक्रिय गर्न खोजिरहेको नाम निर्दिष्ट गर्नुपर्नेछ।
// Read a resource
const resource = await client.readResource({
uri: "file:///example.txt"
});
// Call a tool
const result = await client.callTool({
name: "example-tool",
arguments: {
arg1: "value"
}
});
// call prompt
const promptResult = await client.getPrompt({
name: "review-code",
arguments: {
code: "console.log(\"Hello world\")"
}
})उपरोक्त कोडमा हामीले:
-
स्रोत पढेका छौं, हामीले
readResource()कल गरेरuriनिर्दिष्ट गरेका छौं। यो सर्भर पक्षमा निम्न जस्तो देखिन्छ:server.resource( "readFile", new ResourceTemplate("file://{name}", { list: undefined }), async (uri, { name }) => ({ contents: [{ uri: uri.href, text: `Hello, ${name}!` }] }) );
हाम्रो
uriमानfile://example.txtले सर्भरमाfile://{name}सँग मेल खान्छ।example.txtलाईnameमा म्याप गरिनेछ। -
उपकरण कल गरेका छौं, हामीले यसको
nameरargumentsनिर्दिष्ट गरेर यसलाई कल गरेका छौं:const result = await client.callTool({ name: "example-tool", arguments: { arg1: "value" } });
-
प्रम्प्ट प्राप्त गरेका छौं, प्रम्प्ट प्राप्त गर्न, तपाईंले
getPrompt()लाईnameरargumentsसँग कल गर्नुहुन्छ। सर्भर कोड यसरी देखिन्छ:server.prompt( "review-code", { code: z.string() }, ({ code }) => ({ messages: [{ role: "user", content: { type: "text", text: `Please review this code:\n\n${code}` } }] }) );
र तपाईंको परिणामस्वरूप क्लाइन्ट कोड यसरी देखिन्छ, जसले सर्भरमा घोषणा गरिएकोसँग मेल खान्छ:
const promptResult = await client.getPrompt({ name: "review-code", arguments: { code: "console.log(\"Hello world\")" } })
# Read a resource
print("READING RESOURCE")
content, mime_type = await session.read_resource("greeting://hello")
# Call a tool
print("CALL TOOL")
result = await session.call_tool("add", arguments={"a": 1, "b": 7})
print(result.content)उपरोक्त कोडमा, हामीले:
read_resourceप्रयोग गरेरgreetingनामक स्रोत कल गरेका छौं।call_toolप्रयोग गरेरaddनामक उपकरण सक्रिय गरेका छौं।
- उपकरण कल गर्न केही कोड थपौं:
var result = await mcpClient.CallToolAsync(
"Add",
new Dictionary<string, object?>() { ["a"] = 1, ["b"] = 3 },
cancellationToken:CancellationToken.None);- परिणाम प्रिन्ट गर्न, यहाँ केही कोड छ:
Console.WriteLine(result.Content.First(c => c.Type == "text").Text);
// Sum 4// Call various calculator tools
CallToolResult resultAdd = client.callTool(new CallToolRequest("add", Map.of("a", 5.0, "b", 3.0)));
System.out.println("Add Result = " + resultAdd);
CallToolResult resultSubtract = client.callTool(new CallToolRequest("subtract", Map.of("a", 10.0, "b", 4.0)));
System.out.println("Subtract Result = " + resultSubtract);
CallToolResult resultMultiply = client.callTool(new CallToolRequest("multiply", Map.of("a", 6.0, "b", 7.0)));
System.out.println("Multiply Result = " + resultMultiply);
CallToolResult resultDivide = client.callTool(new CallToolRequest("divide", Map.of("a", 20.0, "b", 4.0)));
System.out.println("Divide Result = " + resultDivide);
CallToolResult resultHelp = client.callTool(new CallToolRequest("help", Map.of()));
System.out.println("Help = " + resultHelp);उपरोक्त कोडमा हामीले:
callTool()विधि प्रयोग गरेरCallToolRequestवस्तुहरूसँग धेरै क्याल्कुलेटर उपकरणहरू कल गरेका छौं।- प्रत्येक उपकरण कलले उपकरणको नाम र सो उपकरणले आवश्यक पर्ने तर्कहरूको
Mapनिर्दिष्ट गर्दछ। - सर्भर उपकरणहरूले विशिष्ट प्यारामिटर नामहरू (जस्तै "a", "b" गणितीय कार्यहरूको लागि) अपेक्षा गर्छन्।
- परिणामहरू
CallToolResultवस्तुहरूका रूपमा फर्काइन्छ, जसमा सर्भरबाट प्रतिक्रिया समावेश हुन्छ।
// Call add tool with arguments = {"a": 3, "b": 2}
let a = 3;
let b = 2;
let tool_result = client
.call_tool(CallToolRequestParam {
name: "add".into(),
arguments: serde_json::json!({ "a": a, "b": b }).as_object().cloned(),
})
.await?;
println!("Result of {:?} + {:?}: {:?}", a, b, tool_result);क्लाइन्ट चलाउन, टर्मिनलमा निम्न आदेश टाइप गर्नुहोस्:
package.json मा "scripts" खण्डमा निम्न प्रविष्टि थप्नुहोस्:
"client": "tsc && node build/client.js"npm run clientक्लाइन्टलाई निम्न आदेशले कल गर्नुहोस्:
python client.pydotnet runपहिले, सुनिश्चित गर्नुहोस् कि तपाईंको MCP सर्भर http://localhost:8080 मा चलिरहेको छ। त्यसपछि क्लाइन्ट चलाउनुहोस्:
# Build you project
./mvnw clean compile
# Run the client
./mvnw exec:java -Dexec.mainClass="com.microsoft.mcp.sample.client.SDKClient"वैकल्पिक रूपमा, तपाईं समाधान फोल्डर 03-GettingStarted\02-client\solution\java मा प्रदान गरिएको पूर्ण क्लाइन्ट प्रोजेक्ट चलाउन सक्नुहुन्छ:
# Navigate to the solution directory
cd 03-GettingStarted/02-client/solution/java
# Build and run the JAR
./mvnw clean package
java -jar target/calculator-client-0.0.1-SNAPSHOT.jarcargo fmt
cargo runयस असाइनमेन्टमा, तपाईंले क्लाइन्ट सिर्जना गर्दा सिकेको कुरा प्रयोग गर्नुहुनेछ, तर आफ्नै क्लाइन्ट सिर्जना गर्नुहोस्।
यहाँ एउटा सर्भर छ, जसलाई तपाईंले आफ्नो क्लाइन्ट कोडमार्फत कल गर्नुपर्नेछ। हेर्नुहोस् कि तपाईं सर्भरमा थप सुविधाहरू थपेर यसलाई अझ रोचक बनाउन सक्नुहुन्छ कि।
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// Create an MCP server
const server = new McpServer({
name: "Demo",
version: "1.0.0"
});
// Add an addition tool
server.tool("add",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }]
})
);
// Add a dynamic greeting resource
server.resource(
"greeting",
new ResourceTemplate("greeting://{name}", { list: undefined }),
async (uri, { name }) => ({
contents: [{
uri: uri.href,
text: `Hello, ${name}!`
}]
})
);
// Start receiving messages on stdin and sending messages on stdout
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCPServer started on stdin/stdout");
}
main().catch((error) => {
console.error("Fatal error: ", error);
process.exit(1);
});# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;
var builder = Host.CreateApplicationBuilder(args);
builder.Logging.AddConsole(consoleLogOptions =>
{
// Configure all logs to go to stderr
consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});
builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithToolsFromAssembly();
await builder.Build().RunAsync();
[McpServerToolType]
public static class CalculatorTool
{
[McpServerTool, Description("Adds two numbers")]
public static string Add(int a, int b) => $"Sum {a + b}";
}यस परियोजनालाई हेर्नुहोस् कि कसरी प्रम्प्ट र स्रोतहरू थप्ने।
साथै, प्रम्प्ट र स्रोतहरू सक्रिय गर्ने बारे जानकारीका लागि यो लिङ्क जाँच गर्नुहोस्।
अघिल्लो खण्ड मा, तपाईंले रस्टको साथ एक साधारण MCP सर्भर कसरी सिर्जना गर्ने सिक्नुभयो। तपाईं यसलाई निर्माण गर्न जारी राख्न सक्नुहुन्छ वा रस्ट-आधारित MCP सर्भरका थप उदाहरणहरूको लागि यो लिङ्क जाँच गर्नुहोस्: MCP Server Examples
समाधान फोल्डर मा यस ट्युटोरियलमा समेटिएका सबै अवधारणाहरू प्रदर्शन गर्ने पूर्ण, तयार-चल्ने क्लाइन्ट कार्यान्वयनहरू समावेश छन्। प्रत्येक समाधानमा क्लाइन्ट र सर्भर कोड अलग, आत्म-निहित परियोजनाहरूमा व्यवस्थित छन्।
समाधान निर्देशिका प्रोग्रामिङ भाषाद्वारा व्यवस्थित छ:
solution/
├── typescript/ # TypeScript client with npm/Node.js setup
│ ├── package.json # Dependencies and scripts
│ ├── tsconfig.json # TypeScript configuration
│ └── src/ # Source code
├── java/ # Java Spring Boot client project
│ ├── pom.xml # Maven configuration
│ ├── src/ # Java source files
│ └── mvnw # Maven wrapper
├── python/ # Python client implementation
│ ├── client.py # Main client code
│ ├── server.py # Compatible server
│ └── README.md # Python-specific instructions
├── dotnet/ # .NET client project
│ ├── dotnet.csproj # Project configuration
│ ├── Program.cs # Main client code
│ └── dotnet.sln # Solution file
├── rust/ # Rust client implementation
| ├── Cargo.lock # Cargo lock file
| ├── Cargo.toml # Project configuration and dependencies
| ├── src # Source code
| │ └── main.rs # Main client code
└── server/ # Additional .NET server implementation
├── Program.cs # Server code
└── server.csproj # Server project file
प्रत्येक भाषा-विशिष्ट समाधानले प्रदान गर्दछ:
- पूर्ण क्लाइन्ट कार्यान्वयन ट्युटोरियलका सबै सुविधाहरूका साथ
- कार्यरत परियोजना संरचना उचित निर्भरताहरू र कन्फिगरेसनका साथ
- निर्माण र चलाउने स्क्रिप्टहरू सजिलो सेटअप र कार्यान्वयनका लागि
- विस्तृत README भाषा-विशिष्ट निर्देशनहरूसहित
- त्रुटि ह्यान्डलिङ र परिणाम प्रशोधनका उदाहरणहरू
-
आफ्नो मनपर्ने भाषा फोल्डरमा जानुहोस्:
cd solution/typescript/ # For TypeScript cd solution/java/ # For Java cd solution/python/ # For Python cd solution/dotnet/ # For .NET
-
प्रत्येक फोल्डरको README निर्देशनहरू पालना गर्नुहोस्:
- निर्भरताहरू स्थापना गर्दै
- परियोजना निर्माण गर्दै
- क्लाइन्ट चलाउँदै
-
उदाहरण आउटपुट जुन तपाईंले देख्नुहुनेछ:
Prompt: Please review this code: console.log("hello"); Resource template: file Tool result: { content: [ { type: 'text', text: '9' } ] }
पूर्ण कागजात र चरण-दर-चरण निर्देशनहरूको लागि, हेर्नुहोस्: 📖 समाधान कागजात
हामीले यस ट्युटोरियलमा समेटिएका सबै प्रोग्रामिङ भाषाहरूका लागि पूर्ण, कार्यरत क्लाइन्ट कार्यान्वयनहरू प्रदान गरेका छौं। यी उदाहरणहरूले माथि वर्णन गरिएको पूर्ण कार्यक्षमता प्रदर्शन गर्छन् र तपाईंका आफ्नै परियोजनाहरूका लागि सन्दर्भ कार्यान्वयन वा सुरुवात बिन्दुका रूपमा प्रयोग गर्न सकिन्छ।
| भाषा | फाइल | विवरण |
|---|---|---|
| जाभा | client_example_java.java |
SSE ट्रान्सपोर्ट प्रयोग गर्ने पूर्ण जाभा क्लाइन्ट, व्यापक त्रुटि ह्यान्डलिङसहित |
| C# | client_example_csharp.cs |
stdio ट्रान्सपोर्ट प्रयोग गर्ने पूर्ण C# क्लाइन्ट, स्वचालित सर्भर स्टार्टअपसहित |
| टाइपस्क्रिप्ट | client_example_typescript.ts |
पूर्ण टाइपस्क्रिप्ट क्लाइन्ट, MCP प्रोटोकलको पूर्ण समर्थनसहित |
| पाइथन | client_example_python.py |
पूर्ण पाइथन क्लाइन्ट, async/await ढाँचाहरू प्रयोग गर्दै |
| रस्ट | client_example_rust.rs |
पूर्ण रस्ट क्लाइन्ट, असिन्क अपरेसनका लागि टोकियो प्रयोग गर्दै |
| प्रत्येक पूर्ण उदाहरणमा समावेश छ: |
- ✅ जडान स्थापना र त्रुटि व्यवस्थापन
- ✅ सर्भर पत्ता लगाउने (उपकरणहरू, स्रोतहरू, आवश्यक परामर्शहरू)
- ✅ क्यालकुलेटर अपरेशनहरू (जोड्ने, घटाउने, गुणा गर्ने, भाग गर्ने, मद्दत)
- ✅ परिणाम प्रक्रिया र स्वरूपित आउटपुट
- ✅ व्यापक त्रुटि व्यवस्थापन
- ✅ सफा, दस्तावेजीकृत कोड चरण-दर-चरण टिप्पणीहरूसँग
- आफ्नो मनपर्ने भाषा चयन गर्नुहोस् माथिको तालिकाबाट
- पूर्ण उदाहरण फाइल समीक्षा गर्नुहोस् सम्पूर्ण कार्यान्वयन बुझ्नका लागि
- उदाहरण चलाउनुहोस्
complete_examples.mdमा दिइएका निर्देशनहरू पालना गर्दै - आफ्नो विशेष प्रयोगको लागि परिमार्जन र विस्तार गर्नुहोस्
यी उदाहरणहरू चलाउने र अनुकूलन गर्ने विस्तृत दस्तावेजको लागि हेर्नुहोस्: 📖 पूर्ण उदाहरण दस्तावेज
| समाधान फोल्डर | पूर्ण उदाहरणहरू |
|---|---|
| निर्माण फाइलहरूसहितको पूर्ण परियोजना संरचना | एकल-फाइल कार्यान्वयनहरू |
| निर्भरतासहित तयार-चलाउन सकिने | केन्द्रित कोड उदाहरणहरू |
| उत्पादन-जस्तै सेटअप | शैक्षिक सन्दर्भ |
| भाषा-विशिष्ट उपकरणहरू | क्रस-भाषा तुलना |
दुवै दृष्टिकोणहरू मूल्यवान छन् - समाधान फोल्डर पूर्ण परियोजनाहरूको लागि प्रयोग गर्नुहोस् र पूर्ण उदाहरणहरू सिकाइ र सन्दर्भको लागि।
यस अध्यायको मुख्य कुरा क्लाइन्टहरूको बारेमा निम्न छन्:
- सर्भरमा सुविधाहरू पत्ता लगाउन र प्रयोग गर्न दुवैको लागि प्रयोग गर्न सकिन्छ।
- सर्भर सुरु गर्न सक्छ जब यो आफैं सुरु हुन्छ (जस्तै यस अध्यायमा) तर क्लाइन्टहरू चलिरहेको सर्भरहरूसँग पनि जडान गर्न सक्छन्।
- सर्भर क्षमताहरू परीक्षण गर्न उत्कृष्ट तरिका हो, वैकल्पिकहरू जस्तै इन्स्पेक्टरको साथ, जुन अघिल्लो अध्यायमा वर्णन गरिएको थियो।
- जाभा क्यालकुलेटर
- .Net क्यालकुलेटर
- जाभास्क्रिप्ट क्यालकुलेटर
- टाइपस्क्रिप्ट क्यालकुलेटर
- पाइथन क्यालकुलेटर
- रस्ट क्यालकुलेटर
अस्वीकरण:
यो दस्तावेज़ AI अनुवाद सेवा Co-op Translator प्रयोग गरेर अनुवाद गरिएको छ। हामी यथार्थताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।