feat: introduce mcp-server crate (#792)
This introduces the `mcp-server` crate, which contains a barebones MCP server that provides an `echo` tool that echoes the user's request back to them. To test it out, I launched [modelcontextprotocol/inspector](https://github.com/modelcontextprotocol/inspector) like so: ``` mcp-server$ npx @modelcontextprotocol/inspector cargo run -- ``` and opened up `http://127.0.0.1:6274` in my browser:  I also had to make a small fix to `mcp-types`, adding `#[serde(untagged)]` to a number of `enum`s.
This commit is contained in:
@@ -359,7 +359,6 @@ def implements_notification_trait(name: str) -> bool:
|
||||
def add_trait_impl(
|
||||
type_name: str, trait_name: str, fields: list[StructField], out: list[str]
|
||||
) -> None:
|
||||
# out.append("#[derive(Debug)]\n")
|
||||
out.append(STANDARD_DERIVE)
|
||||
out.append(f"pub enum {type_name} {{}}\n\n")
|
||||
|
||||
@@ -507,10 +506,8 @@ def get_serde_annotation_for_anyof_type(type_name: str) -> str | None:
|
||||
return '#[serde(tag = "method", content = "params")]'
|
||||
case "ServerNotification":
|
||||
return '#[serde(tag = "method", content = "params")]'
|
||||
case "JSONRPCMessage":
|
||||
return "#[serde(untagged)]"
|
||||
case _:
|
||||
return None
|
||||
return "#[serde(untagged)]"
|
||||
|
||||
|
||||
def map_type(
|
||||
|
||||
@@ -92,6 +92,7 @@ pub struct CallToolResult {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum CallToolResultContent {
|
||||
TextContent(TextContent),
|
||||
ImageContent(ImageContent),
|
||||
@@ -144,6 +145,7 @@ pub struct ClientCapabilitiesRoots {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ClientNotification {
|
||||
CancelledNotification(CancelledNotification),
|
||||
InitializedNotification(InitializedNotification),
|
||||
@@ -185,6 +187,7 @@ pub enum ClientRequest {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ClientResult {
|
||||
Result(Result),
|
||||
CreateMessageResult(CreateMessageResult),
|
||||
@@ -214,6 +217,7 @@ pub struct CompleteRequestParamsArgument {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum CompleteRequestParamsRef {
|
||||
PromptReference(PromptReference),
|
||||
ResourceReference(ResourceReference),
|
||||
@@ -299,6 +303,7 @@ pub struct CreateMessageResult {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum CreateMessageResultContent {
|
||||
TextContent(TextContent),
|
||||
ImageContent(ImageContent),
|
||||
@@ -327,6 +332,7 @@ pub struct EmbeddedResource {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum EmbeddedResourceResource {
|
||||
TextResourceContents(TextResourceContents),
|
||||
BlobResourceContents(BlobResourceContents),
|
||||
@@ -427,6 +433,7 @@ impl ModelContextProtocolNotification for InitializedNotification {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum JSONRPCBatchRequestItem {
|
||||
JSONRPCRequest(JSONRPCRequest),
|
||||
JSONRPCNotification(JSONRPCNotification),
|
||||
@@ -435,6 +442,7 @@ pub enum JSONRPCBatchRequestItem {
|
||||
pub type JSONRPCBatchRequest = Vec<JSONRPCBatchRequestItem>;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum JSONRPCBatchResponseItem {
|
||||
JSONRPCResponse(JSONRPCResponse),
|
||||
JSONRPCError(JSONRPCError),
|
||||
@@ -852,6 +860,7 @@ pub struct PromptMessage {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum PromptMessageContent {
|
||||
TextContent(TextContent),
|
||||
ImageContent(ImageContent),
|
||||
@@ -887,6 +896,7 @@ pub struct ReadResourceResult {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ReadResourceResultContents {
|
||||
TextResourceContents(TextResourceContents),
|
||||
BlobResourceContents(BlobResourceContents),
|
||||
@@ -1012,6 +1022,7 @@ pub struct SamplingMessage {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum SamplingMessageContent {
|
||||
TextContent(TextContent),
|
||||
ImageContent(ImageContent),
|
||||
@@ -1100,6 +1111,7 @@ pub enum ServerNotification {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ServerRequest {
|
||||
PingRequest(PingRequest),
|
||||
CreateMessageRequest(CreateMessageRequest),
|
||||
@@ -1107,6 +1119,7 @@ pub enum ServerRequest {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ServerResult {
|
||||
Result(Result),
|
||||
InitializeResult(InitializeResult),
|
||||
|
||||
Reference in New Issue
Block a user