A library for building Model Context Protocol servers and clients.
struct GreetInput {
name : String
} derive(@json.FromJson, ToJson)
impl @schema.JsonSchema for GreetInput with fn json_schema() {
@schema.Schema::object(
properties={ "name": @schema.Schema::string(min_length=1) },
required=["name"],
)
}
async fn main {
let builder = try! @server.ServerBuilder(name="greeter", version="1.0.0")
try! builder.tool(name="greet", fn(_ctx, input : GreetInput) {
@mcp.Complete(@mcp.CallToolResult::text("Hello, \{input.name}!"))
})
// Stdio transport
@stdio.serve(builder.build())
}async fn main {
@async.with_task_group(async fn(group) {
let transport = try! @stdio.Transport(group, "path/to/server")
let client = try! @client.Client(name="client", version="1.0.0", transport~)
match client.call_tool(name="greet", arguments={ "name": "MoonBit" }) {
Complete(res) => println(res.content)
InputRequired(pending) => ... // Handle multi-round interactive requests
ExtensionResult(kind, val) => ...
}
transport.shutdown()
})
}| Package | Description |
|---|---|
| shiguri-01/mcp | Core protocol types, content models, and error definitions (McpError) |
| shiguri-01/mcp/server | Typed server builder, dispatching, and session management |
| shiguri-01/mcp/client | Client runtime, discovery, typed invocation, and MRTR resolution |
| shiguri-01/mcp/schema | JSON Schema (Draft 2020-12) builder, validator, and typed decoder |
| shiguri-01/mcp/stdio | Stdio transport (server runner & subprocess client) |
| shiguri-01/mcp/http | Streamable HTTP transport (SSE progress/subscriptions & OAuth 2.0) |
| shiguri-01/mcp/auth | Native MCP Authorization (RFC 9728, PKCE S256, token caching) |
| shiguri-01/mcp/jsonrpc | Low-level JSON-RPC 2.0 wire envelopes and parser |
# Stdio Server & Client
moon build --target native src/examples/stdio-server
MCP_STDIO_SERVER="$PWD/_build/native/debug/build/examples/stdio-server/stdio-server" \
moon run --target native src/examples/stdio-client
# HTTP Server & Client
moon run --target native src/examples/http-server
moon run --target native src/examples/http-clientpub(all) suberror McpError {
ParseError(String)
InvalidRequest(String)
MethodNotFound(String)
InvalidParams(String)
InvalidParamsWithData(String, Json)
InternalError(String)
HeaderMismatch(String)
MissingRequiredClientCapability(String, ClientCapabilities)
UnsupportedProtocolVersion(requested~ : String, supported~ : Array[String])
RemoteError(code~ : Int, message~ : String, data~ : Json?)
} derive(Eq, Debug)impl ToJson for Annotationsimpl FromJson for Annotationsfn Annotations::Annotations(audience? : Array[Role], priority? : Double, last_modified? : String) -> Annotations raise McpErrorimpl ToJson for CachePolicyimpl FromJson for CachePolicyimpl ToJson for CacheScopeimpl FromJson for CacheScopeimpl ToJson for CallToolParamsimpl FromJson for CallToolParamsfn CallToolParams::CallToolParams(name~ : String, arguments? : Json) -> CallToolParams raise McpErrorimpl ToJson for CallToolResultimpl FromJson for CallToolResultfn CallToolResult::CallToolResult(content~ : Array[Content], structured_content? : Json, is_error? : Bool, meta? : ResultMeta) -> CallToolResultfn CallToolResult::error_text(text : String, annotations? : Annotations, meta? : Json) -> CallToolResultimpl ToJson for CancelledNotificationfn CancelledNotification::CancelledNotification(request_id~ : Json, reason? : String) -> CancelledNotification raise McpErrorfn CancelledNotification::to_jsonrpc(self : CancelledNotification) -> Notification[CancelledNotificationParams]impl ToJson for CancelledNotificationParamsimpl FromJson for CancelledNotificationParamsfn CancelledNotificationParams::CancelledNotificationParams(request_id~ : Json, reason? : String) -> CancelledNotificationParams raise McpErrorfn CancelledNotificationParams::from_json(value : Json, path? : JsonPath) -> CancelledNotificationParams raise McpErrorpub struct ClientCapabilities {
roots : RootsCapability?
sampling : SamplingCapability?
elicitation : ElicitationCapability?
extensions : Map[String, Json]
experimental : Map[String, Json]
extra : Map[String, Json]
} derive(Eq, Debug)impl ToJson for ClientCapabilitiesimpl FromJson for ClientCapabilitiesfn ClientCapabilities::ClientCapabilities(roots? : RootsCapability, sampling? : SamplingCapability, elicitation? : ElicitationCapability, extensions? : Map[String, Json], experimental? : Map[String, Json], extra? : Map[String, Json]) -> ClientCapabilitiesfn ClientCapabilities::from_json(value : Json, path? : JsonPath) -> ClientCapabilities raise McpErrorpub struct CompleteResult {
values : Array[String]
total : Int?
has_more : Bool
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for CompleteResultimpl FromJson for CompleteResultfn CompleteResult::CompleteResult(values~ : Array[String], total? : Int, has_more? : Bool, meta? : ResultMeta) -> CompleteResult raise McpErrorimpl ToJson for CompletionReferenceimpl FromJson for CompletionReferencepub struct CompletionRequest {
reference : CompletionReference
argument_name : String
argument_value : String
context_arguments : Map[String, String]
meta : Json?
} derive(Eq, Debug)pub(all) enum Content {
TextContent(text~ : String, annotations~ : Annotations?, meta~ : Json?)
ImageContent(data~ : String, mime_type~ : String, annotations~ : Annotations?, meta~ : Json?)
AudioContent(data~ : String, mime_type~ : String, annotations~ : Annotations?, meta~ : Json?)
EmbeddedResource(resource~ : ResourceContent, annotations~ : Annotations?, meta~ : Json?)
ResourceLink(ResourceLink)
} derive(Eq, Debug)fn Content::audio(data~ : String, mime_type~ : String, annotations? : Annotations, meta? : Json) -> Contentfn Content::embedded_resource(resource~ : ResourceContent, annotations? : Annotations, meta? : Json) -> Contentfn Content::image(data~ : String, mime_type~ : String, annotations? : Annotations, meta? : Json) -> Contentpub struct DiscoverResult {
supported_versions : Array[String]
capabilities : ServerCapabilities
instructions : String?
cache_policy : CachePolicy
meta : ResultMeta?
} derive(Debug)impl ToJson for DiscoverResultimpl FromJson for DiscoverResultfn DiscoverResult::DiscoverResult(supported_versions? : Array[String], capabilities~ : ServerCapabilities, instructions? : String, cache_policy~ : CachePolicy, meta? : ResultMeta) -> DiscoverResult raise McpErrorimpl ToJson for ElicitationCapabilityimpl FromJson for ElicitationCapabilityfn ElicitationCapability::from_json(value : Json, path? : JsonPath) -> ElicitationCapability raise McpErrorimpl FromJson for ElicitationCreateParamsfn ElicitationCreateParams::from_json(value : Json, path? : JsonPath) -> ElicitationCreateParams raise McpErrorimpl ToJson for ElicitationCreateResultimpl FromJson for ElicitationCreateResultfn ElicitationCreateResult::from_json(value : Json, path? : JsonPath) -> ElicitationCreateResult raise McpErrorfn ElicitationCreateResult::validate_against_request(self : ElicitationCreateResult, request_params : Json) -> Unit raise McpErrorpub(all) enum ElicitationMode {
Url(String)
Form(requested_schema~ : Json, properties~ : Map[String, ElicitationPrimitiveSchema], compiled_schema~ : Schema)
} derive(Debug)pub struct ElicitationPrimitiveSchema {
schema_type : ElicitationPrimitiveType
raw : Json
} derive(Eq, Debug)impl FromJson for ElicitationPrimitiveSchemafn ElicitationPrimitiveSchema::from_json(value : Json, path? : JsonPath) -> ElicitationPrimitiveSchema raise McpErrorimpl ToJson for GetPromptParamsimpl FromJson for GetPromptParamsfn GetPromptParams::GetPromptParams(name~ : String, arguments? : Map[String, String]) -> GetPromptParams raise McpErrorpub struct GetPromptResult {
description : String?
messages : Array[PromptMessage]
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for GetPromptResultimpl FromJson for GetPromptResultfn GetPromptResult::GetPromptResult(messages~ : Array[PromptMessage], description? : String, meta? : ResultMeta) -> GetPromptResultpub(all) enum HandlerOutcome[T] {
Complete(T)
InputRequired(InputRequiredResult)
ExtensionResult(String, Json)
}fn[T] HandlerOutcome::require_complete(self : HandlerOutcome[T], context~ : String) -> T raise McpErrorimpl ToJson for Implementationimpl FromJson for Implementationfn Implementation::Implementation(name~ : String, version~ : String, title? : String, description? : String, icons? : Array[Icon], website_url? : String) -> Implementationimpl ToJson for InputRequestimpl FromJson for InputRequestpub struct InputRequiredResult {
input_requests : Map[String, InputRequest]?
request_state : String?
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for InputRequiredResultimpl FromJson for InputRequiredResultfn InputRequiredResult::InputRequiredResult(input_requests? : Map[String, InputRequest], request_state? : String, meta? : ResultMeta) -> InputRequiredResult raise McpErrorfn InputRequiredResult::from_json(value : Json, path? : JsonPath) -> InputRequiredResult raise McpErrorfn InputRequiredResult::retry_options(self : InputRequiredResult, responses : Map[String, InputResponse], base? : RequestOptions) -> RequestOptions raise McpErrorimpl ToJson for InputResponseimpl FromJson for InputResponseimpl ToJson for ListParamsimpl FromJson for ListParamspub struct ListPromptsResult {
prompts : Array[Prompt]
next_cursor : String?
cache_policy : CachePolicy
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for ListPromptsResultimpl FromJson for ListPromptsResultpub struct ListResourceTemplatesResult {
resource_templates : Array[ResourceTemplate]
next_cursor : String?
cache_policy : CachePolicy
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for ListResourceTemplatesResultimpl FromJson for ListResourceTemplatesResultfn ListResourceTemplatesResult::from_json(value : Json, path? : JsonPath) -> ListResourceTemplatesResult raise McpErrorpub struct ListResourcesResult {
resources : Array[Resource]
next_cursor : String?
cache_policy : CachePolicy
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for ListResourcesResultimpl FromJson for ListResourcesResultfn ListResourcesResult::from_json(value : Json, path? : JsonPath) -> ListResourcesResult raise McpErrorpub struct ListToolsResult {
tools : Array[Tool]
next_cursor : String?
cache_policy : CachePolicy
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for ListToolsResultimpl FromJson for ListToolsResultimpl ToJson for LoggingCapabilityimpl FromJson for LoggingCapabilityimpl ToJson for LoggingLevelimpl FromJson for LoggingLevelpub struct LoggingMessageNotification {
params : LoggingMessageNotificationParams
} derive(Eq, Debug)impl ToJson for LoggingMessageNotificationfn LoggingMessageNotification::LoggingMessageNotification(level~ : LoggingLevel, data~ : Json, logger? : String) -> LoggingMessageNotificationfn LoggingMessageNotification::to_jsonrpc(self : LoggingMessageNotification) -> Notification[LoggingMessageNotificationParams]pub struct LoggingMessageNotificationParams {
level : LoggingLevel
data : Json
logger : String?
} derive(Eq, Debug)impl ToJson for LoggingMessageNotificationParamsimpl FromJson for LoggingMessageNotificationParamsfn from_json(value : Json, path : JsonPath) -> LoggingMessageNotificationParams raise JsonDecodeErrorfn LoggingMessageNotificationParams::LoggingMessageNotificationParams(level~ : LoggingLevel, data~ : Json, logger? : String) -> LoggingMessageNotificationParamsfn LoggingMessageNotificationParams::from_json(value : Json, path? : JsonPath) -> LoggingMessageNotificationParams raise McpErrorimpl ToJson for ProgressNotificationfn ProgressNotification::ProgressNotification(progress_token~ : Json, progress~ : Double, total? : Double, message? : String) -> ProgressNotification raise McpErrorfn ProgressNotification::to_jsonrpc(self : ProgressNotification) -> Notification[ProgressNotificationParams]impl ToJson for ProgressNotificationParamsimpl FromJson for ProgressNotificationParamsfn ProgressNotificationParams::ProgressNotificationParams(progress_token~ : Json, progress~ : Double, total? : Double, message? : String) -> ProgressNotificationParams raise McpErrorfn ProgressNotificationParams::from_json(value : Json, path? : JsonPath) -> ProgressNotificationParams raise McpErrorimpl ToJson for PromptArgumentimpl FromJson for PromptArgumentfn PromptArgument::PromptArgument(name~ : String, title? : String, description? : String, required? : Bool) -> PromptArgumentimpl ToJson for PromptMessageimpl FromJson for PromptMessageimpl ToJson for PromptsCapabilityimpl FromJson for PromptsCapabilitypub struct PromptsListChangedNotification {
params : SubscriptionNotificationParams
} derive(Eq, Debug)impl ToJson for PromptsListChangedNotificationfn PromptsListChangedNotification::PromptsListChangedNotification(subscription_id~ : RequestId) -> PromptsListChangedNotificationfn PromptsListChangedNotification::to_jsonrpc(self : PromptsListChangedNotification) -> Notification[SubscriptionNotificationParams]impl ToJson for ReadResourceParamsimpl FromJson for ReadResourceParamsfn ReadResourceParams::from_json(value : Json, path? : JsonPath) -> ReadResourceParams raise McpErrorpub struct ReadResourceResult {
contents : Array[ResourceContent]
cache_policy : CachePolicy?
meta : ResultMeta?
} derive(Eq, Debug)impl ToJson for ReadResourceResultimpl FromJson for ReadResourceResultfn ReadResourceResult::ReadResourceResult(contents~ : Array[ResourceContent], cache_policy? : CachePolicy, meta? : ResultMeta) -> ReadResourceResultfn ReadResourceResult::from_json(value : Json, path? : JsonPath) -> ReadResourceResult raise McpErrorfn ReadResourceResult::text(uri~ : String, text~ : String, mime_type? : String) -> ReadResourceResultpub struct RequestContext {
request_id : Json
method_name : String
meta : RequestMeta
input_responses : Map[String, InputResponse]?
request_state : String?
transport_meta : Json?
hooks : RequestHooks
}fn RequestContext::RequestContext(request_id~ : Json, method_name~ : String, meta~ : RequestMeta, input_responses? : Map[String, InputResponse], request_state? : String, hooks? : RequestHooks) -> RequestContext raise McpErrorasync fn RequestContext::report_progress(self : RequestContext, progress~ : Double, total? : Double, message? : String) -> Unit raise McpErrorpub struct RequestHooks {
// private fields
}fn RequestHooks::RequestHooks(emit_notification? : async (Json) -> Unit raise McpError, is_cancelled? : () -> Bool, transport_meta? : Json) -> RequestHookspub struct RequestMeta {
protocol_version : String
client_info : Implementation?
client_capabilities : ClientCapabilities
progress_token : Json?
log_level : LoggingLevel?
extra : Map[String, Json]
} derive(Eq, Debug)impl ToJson for RequestMetaimpl FromJson for RequestMetafn RequestMeta::RequestMeta(protocol_version? : String, client_info? : Implementation, client_capabilities? : ClientCapabilities, progress_token? : Json, log_level? : LoggingLevel, extra? : Map[String, Json]) -> RequestMeta raise McpErrorpub struct RequestOptions {
progress_token : Json?
log_level : LoggingLevel?
input_responses : Map[String, InputResponse]?
request_state : String?
meta : Map[String, Json]
} derive(Eq, Debug)fn RequestOptions::RequestOptions(progress_token? : Json, log_level? : LoggingLevel, input_responses? : Map[String, InputResponse], request_state? : String, meta? : Map[String, Json]) -> RequestOptionsfn RequestOptions::request_meta(self : RequestOptions, client_capabilities~ : ClientCapabilities, client_info? : Implementation, protocol_version? : String) -> RequestMeta raise McpErrorfn RequestOptions::request_params(self : RequestOptions, params : Map[String, Json], client_capabilities~ : ClientCapabilities, client_info? : Implementation, protocol_version? : String) -> Json raise McpErrorimpl ToJson for ResourceContentimpl FromJson for ResourceContentfn ResourceContent::blob(uri~ : String, blob~ : String, mime_type? : String, meta? : Json) -> ResourceContentfn ResourceContent::text(uri~ : String, text~ : String, mime_type? : String, meta? : Json) -> ResourceContentimpl ToJson for ResourceLinkimpl FromJson for ResourceLinkfn ResourceLink::ResourceLink(uri~ : String, name~ : String, title? : String, description? : String, mime_type? : String, icons? : Array[Icon], annotations? : Annotations, size? : Int64, meta? : Json) -> ResourceLink raise McpErrorimpl ToJson for ResourceTemplateimpl FromJson for ResourceTemplatefn ResourceTemplate::ResourceTemplate(uri_template~ : String, name~ : String, title? : String, description? : String, mime_type? : String, icons? : Array[Icon], annotations? : Annotations, meta? : Map[String, Json]) -> ResourceTemplate raise McpErrorpub struct ResourceUpdatedNotification {
params : ResourceUpdatedNotificationParams
} derive(Eq, Debug)impl ToJson for ResourceUpdatedNotificationfn ResourceUpdatedNotification::ResourceUpdatedNotification(uri~ : String, subscription_id~ : RequestId) -> ResourceUpdatedNotification raise McpErrorfn ResourceUpdatedNotification::to_jsonrpc(self : ResourceUpdatedNotification) -> Notification[ResourceUpdatedNotificationParams]impl ToJson for ResourceUpdatedNotificationParamsfn from_json(value : Json, path : JsonPath) -> ResourceUpdatedNotificationParams raise JsonDecodeErrorfn ResourceUpdatedNotificationParams::ResourceUpdatedNotificationParams(uri~ : String, subscription_id~ : RequestId) -> ResourceUpdatedNotificationParams raise McpErrorfn ResourceUpdatedNotificationParams::from_json(value : Json, path? : JsonPath) -> ResourceUpdatedNotificationParams raise McpErrorimpl ToJson for ResourcesCapabilityimpl FromJson for ResourcesCapabilityfn ResourcesCapability::ResourcesCapability(subscribe? : Bool, list_changed? : Bool) -> ResourcesCapabilityfn ResourcesCapability::from_json(value : Json, path? : JsonPath) -> ResourcesCapability raise McpErrorpub struct ResourcesListChangedNotification {
params : SubscriptionNotificationParams
} derive(Eq, Debug)impl ToJson for ResourcesListChangedNotificationfn ResourcesListChangedNotification::ResourcesListChangedNotification(subscription_id~ : RequestId) -> ResourcesListChangedNotificationfn ResourcesListChangedNotification::to_jsonrpc(self : ResourcesListChangedNotification) -> Notification[SubscriptionNotificationParams]impl ToJson for ResultMetaimpl FromJson for ResultMetafn ResultMeta::ResultMeta(server_info? : Implementation, extra? : Map[String, Json]) -> ResultMeta raise McpErrorimpl ToJson for RootsCapabilityimpl FromJson for RootsCapabilityimpl ToJson for SamplingCapabilityimpl FromJson for SamplingCapabilityfn SamplingCapability::from_json(value : Json, path? : JsonPath) -> SamplingCapability raise McpErrorpub(all) enum SamplingContent {
Single(SamplingContentBlock)
Multiple(Array[SamplingContentBlock])
} derive(Eq, Debug)impl ToJson for SamplingContentBlockimpl FromJson for SamplingContentBlockfn SamplingContentBlock::from_json(value : Json, path? : JsonPath) -> SamplingContentBlock raise McpErrorpub struct SamplingCreateMessageParams {
messages : Array[SamplingMessage]
max_tokens : Double
} derive(Eq, Debug)impl FromJson for SamplingCreateMessageParamsfn SamplingCreateMessageParams::from_json(value : Json, path? : JsonPath) -> SamplingCreateMessageParams raise McpErrorpub struct SamplingCreateMessageResult {
model : String
role : Role
content : SamplingContent
} derive(Eq, Debug)impl FromJson for SamplingCreateMessageResultfn SamplingCreateMessageResult::from_json(value : Json, path? : JsonPath) -> SamplingCreateMessageResult raise McpErrorpub struct ServerCapabilities {
tools : ToolsCapability?
resources : ResourcesCapability?
prompts : PromptsCapability?
logging : LoggingCapability?
completions : Bool
extensions : Map[String, Json]
experimental : Map[String, Json]
extra : Map[String, Json]
} derive(Eq, Debug)impl ToJson for ServerCapabilitiesimpl FromJson for ServerCapabilitiesfn ServerCapabilities::ServerCapabilities(tools? : ToolsCapability, resources? : ResourcesCapability, prompts? : PromptsCapability, logging? : LoggingCapability, completions? : Bool, extensions? : Map[String, Json], experimental? : Map[String, Json], extra? : Map[String, Json]) -> ServerCapabilitiesfn ServerCapabilities::from_json(value : Json, path? : JsonPath) -> ServerCapabilities raise McpErrorimpl ToJson for SubscriptionFilterimpl FromJson for SubscriptionFilterfn SubscriptionFilter::SubscriptionFilter(tools_list_changed? : Bool, prompts_list_changed? : Bool, resources_list_changed? : Bool, resource_subscriptions? : Array[String]) -> SubscriptionFilterimpl ToJson for SubscriptionNotificationParamsimpl FromJson for SubscriptionNotificationParamsfn SubscriptionNotificationParams::SubscriptionNotificationParams(subscription_id~ : RequestId) -> SubscriptionNotificationParamsfn SubscriptionNotificationParams::from_json(value : Json, path? : JsonPath) -> SubscriptionNotificationParams raise McpErrorpub struct SubscriptionsAcknowledgedNotification {
params : SubscriptionsAcknowledgedNotificationParams
} derive(Eq, Debug)fn SubscriptionsAcknowledgedNotification::SubscriptionsAcknowledgedNotification(subscription_id~ : RequestId, notifications~ : SubscriptionFilter) -> SubscriptionsAcknowledgedNotificationfn SubscriptionsAcknowledgedNotification::to_json(self : SubscriptionsAcknowledgedNotification) -> Jsonpub struct SubscriptionsAcknowledgedNotificationParams {
subscription_id : RequestId
notifications : SubscriptionFilter
} derive(Eq, Debug)fn from_json(value : Json, path : JsonPath) -> SubscriptionsAcknowledgedNotificationParams raise JsonDecodeErrorfn SubscriptionsAcknowledgedNotificationParams::SubscriptionsAcknowledgedNotificationParams(subscription_id~ : RequestId, notifications~ : SubscriptionFilter) -> SubscriptionsAcknowledgedNotificationParamsfn SubscriptionsAcknowledgedNotificationParams::from_json(value : Json, path? : JsonPath) -> SubscriptionsAcknowledgedNotificationParams raise McpErrorimpl ToJson for SubscriptionsListenResultimpl ToJson for ToolAnnotationsimpl FromJson for ToolAnnotationsfn ToolAnnotations::ToolAnnotations(title? : String, read_only_hint? : Bool, destructive_hint? : Bool, idempotent_hint? : Bool, open_world_hint? : Bool) -> ToolAnnotationsimpl ToJson for ToolsCapabilityimpl FromJson for ToolsCapabilitypub struct ToolsListChangedNotification {
params : SubscriptionNotificationParams
} derive(Eq, Debug)impl ToJson for ToolsListChangedNotificationfn ToolsListChangedNotification::ToolsListChangedNotification(subscription_id~ : RequestId) -> ToolsListChangedNotificationfn ToolsListChangedNotification::to_jsonrpc(self : ToolsListChangedNotification) -> Notification[SubscriptionNotificationParams]Install
Download zipA library for building Model Context Protocol servers and clients.