mcpkit

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 31, 2026 License: MIT Imports: 0 Imported by: 0

README

mcpkit

Agent-facing MCP ergonomics built on modelcontextprotocol/go-sdk.

It adds structured agent tool results, optional proxy-tool plumbing, and list/preview helpers.

Single runtime dependency: modelcontextprotocol/go-sdk

Install

go get github.com/brandonkramer/mcpkit

Development

Install git hooks once in the repo:

lefthook install

Hooks run golangci-lint on commit (staged .go files) and ./scripts/check.sh on push (tests, examples build, lint). CI runs the same checks on pull requests.

make check    # full local CI script
make test
make lint

Level Packages When
Minimal envelope, adapter Hand-written tool handlers; you build the envelope yourself
Proxy + summarize, tool Tools call a backend (RPC, DB, HTTP); shared normalize→present→envelope pipeline
Full + present, server Capped list payloads, previews, stdio bootstrap

Minimal: envelope + adapter

Register tools directly with go-sdk

sdkmcp.AddTool(server, &sdkmcp.Tool{
    Name: "ping", Description: "Health check",
}, func(ctx context.Context, _ *sdkmcp.CallToolRequest, _ struct{}) (*sdkmcp.CallToolResult, any, error) {
    env := envelope.Success("ping").
        Summary("pong").
        Data(map[string]string{"status": "ok"}).
        Build()
    return adapter.FromEnvelope(&env)
})

Shorthand helpers (same envelope shape, less boilerplate):

return adapter.OK("notes.list", "2 note(s)", data, "notes.create title=\"...\"")
return adapter.ErrorCode("not_found", err)

On error without a code:

return adapter.Error(err)

Text mode for clients that only read content text (structured envelope still in structuredContent):

adapter.OKWithOptions("notes.get", "note 01", data, adapter.Options{Text: adapter.TextSummary})
// TextFull (default): full envelope JSON in text
// TextSummary: summary line only
// TextNone: no text content

No summarize.Registry, no tool.Bridge, no server helper required.


Proxy: backend + registry

When tools proxy to a service and share summarization logic:

reg := summarize.Passthrough() // or your own Registry; Passthrough() for day-one proxy wiring

bridge := &tool.Bridge{
    Backend:   tool.FuncBackend(myBackend.Call),
    Responder: summarize.NewResponder(reg),
}

tool.AddProxy(server, bridge, tool.ProxySpec[CreateArgs, Item]{
    Name: "items.create", Description: "Create an item",
    Prepare: func(_ *tool.Bridge, args CreateArgs) (CreateArgs, summarize.Meta, error) {
        return tool.PrepareWorkDir(defaultWorkDir, args, setWorkDir, getWorkDir)
    },
})

WorkDir is app-specific — use tool.ResolveWorkDir / tool.PrepareWorkDir in your prepare hooks, not on Bridge.

List tool summarization:

summary, next := present.SummarizeToolList(data, meta, summarize.ToolListSummary[Item]{
    CountLabel: "item(s)",
    Next:       []string{"items.create title=\"...\""},
    PageHint:   "narrow filter=... or use CLI for full list",
    NextFor: func(item Item) []string {
        return []string{envelope.Hint("items.get", envelope.HintParam("id", item.ID))}
    },
})

summarize.Meta

Meta passes context from prepare / present hooks to summarizers.

Field Purpose
Limit List cap applied during present (used by SummarizeToolList)
SinceSeq Optional paging cursor (ignore if unused)
RunID Optional entity id context (ignore if unused)
Extra Open bag: meta.Put("table", "notes"), read with meta.String("table")

Only use the fields your app needs. A replay/poll proxy might use Limit, SinceSeq, and RunID; a notes MCP might only set Limit or use Extra alone.


Transport

Transport Use
Stdio server.ServeStdio(server.Config{...})
HTTP / streamable go-sdk — mcpkit does not wrap HTTP

Build once with server.New, then serve over any go-sdk transport:

server, _, err := mcpserver.New(mcpserver.Config{
    Name: "notes", Version: "1.0.0",
    Register: func(s *sdkmcp.Server, _ string) { registerNotesTools(s, db) },
})

// Stdio
_ = server.Run(ctx, &sdkmcp.StdioTransport{})

// HTTP (go-sdk) — see modelcontextprotocol/go-sdk StreamableHTTPHandler
handler := sdkmcp.NewStreamableHTTPHandler(func(_ *http.Request) *sdkmcp.Server {
    return server
}, nil)
_ = http.ListenAndServe(":8080", handler)

Packages

Package Purpose
envelope ok, summary, subjects, data, next_actions, diagnostics
adapter OK, ErrorCode, text modes; map envelopes to CallToolResult
summarize Passthrough, ToolSummaries, ToolListItems, Meta
present ToolListData, WrapToolList, ToolListItems, MapCapList, RedactText
tool Proxy pipeline, ResolveWorkDir, PrepareWorkDir, NormalizeField, NormalizeID
server Stdio bootstrap via ServeStdio / New

Documentation

Overview

Module mcpkit provides agent-facing MCP ergonomics on top of github.com/modelcontextprotocol/go-sdk.

Integration levels:

  • minimal: envelope + adapter only (hand-written tool handlers)
  • proxy: tool.AddProxy pipeline with Backend + summarize.Registry
  • full: present list shaping + server.ServeStdio or go-sdk HTTP transports

Subpackages:

  • envelope: domain-neutral tool result JSON envelopes
  • adapter: envelope to CallToolResult mapping
  • summarize: pluggable summary/subject hooks and responder
  • present: ToolListData, previews, capped list views
  • tool: proxy-tool registration pipeline
  • server: stdio server bootstrap (HTTP via go-sdk)

mcpkit intentionally does not reimplement MCP transport or protocol handling.

Directories

Path Synopsis
Package adapter maps envelope values onto MCP CallToolResult values from go-sdk.
Package adapter maps envelope values onto MCP CallToolResult values from go-sdk.
Package envelope defines domain-neutral JSON tool result envelopes and helpers.
Package envelope defines domain-neutral JSON tool result envelopes and helpers.
examples
notes command
Package present provides bounded list and field preview helpers for tool payloads.
Package present provides bounded list and field preview helpers for tool payloads.
Package server provides stdio MCP server bootstrap helpers built on go-sdk.
Package server provides stdio MCP server bootstrap helpers built on go-sdk.
Package summarize provides pluggable tool result summarization hooks.
Package summarize provides pluggable tool result summarization hooks.
Package tool provides proxy-tool registration on top of modelcontextprotocol/go-sdk.
Package tool provides proxy-tool registration on top of modelcontextprotocol/go-sdk.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL