mcp-trial
Mein Versuch, das Model Context Protocol zu verstehen, indem ich einen Server für die GitHub-API baue.
Python SDK v2, läuft über stdio und ist an Claude Code angebunden.
Was es tut
Zwei Tools, eines für eine Zusammenfassung eines Repos und eines für dessen letzte Commit-Nachrichten. Es gibt auch eine Ressource, die das rohe README eines Repos bereitstellt, und eine Prompt-Vorlage zur Bewertung eines Repos als Portfolio-Stück.
Related MCP server: GitHub MCP Server
So führst du es aus
uv sync
uv run mcp dev server.py # opens the inspector
uv run python test_server.py # calls the server directly, no host neededUm es bei Claude Code zu registrieren:
claude mcp add gh-lab -- uv run --directory /path/to/mcp-trial mcp run server.pyWas ich gelernt habe
Deine Typannotationen sind der eigentliche API-Vertrag, da das SDK das JSON-Schema der Tools direkt aus
der Funktionssignatur erstellt. Wenn du limit: int = 5 schreibst, wird dieser Parameter dadurch auch
optional – der Parameter kann also weggelassen werden.
Docstrings sind wichtiger, als ich erwartet hatte, weil sie als Tool-Beschreibung an das Modell gesendet werden und darüber entscheiden, welches Tool das Modell auswählt. Ich habe Claude Code gefragt, ob ein Repo aktiv gepflegt wird, und es hat beide Tools aufgerufen und die Sache selbst herausgefunden, was nur funktionierte, weil die Beschreibungen die Kombination nahegelegt haben.
Alles, was ein Tool zurückgibt, wird im Kontext des Modells zu Text, also kostet jedes Feld Tokens. GitHub liefert etwa hundert Felder zurück und ich gebe nur fünf zurück.
Einen Fehler zu werfen ist besser, als einen zurückzugeben, da das Werfen ein Flag setzt, das der Host prüft, und die Nachricht erreicht das Modell als etwas, auf das es reagieren kann.
Async macht nichts schneller. Ein einzelner Aufruf dauert genauso lange. Was await bewirkt, ist, die
Funktion zu pausieren und die Ereignisschleife freizugeben, damit andere Aufrufe während des Wartens
laufen können.
Notizen
mcp-reference.md enthält meine handschriftlichen Notizen aus der Entwicklung.
Available Tools
2 toolsget_repoA
Get summary info for a GitHub repository: description, stars, language, last push.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. 'Get summary info' conveys a read-only operation and names the returned fields, but it does not mention authentication needs, rate limits, error behavior, or edge cases like repositories without a last push.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly structured sentence front-loads the action and resource, then enumerates concrete outputs. There is no filler, repetition, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only metadata tool, the description is largely complete: it states the operation, target resource, and output fields. A note about when to prefer recent_commits would improve it, but that gap is already reflected in the usage guidelines score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions and the description does not define 'owner' or 'repo' beyond the general reference to a GitHub repository. The parameter names are fairly self-evident, but the description adds no meaningful semantic depth.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Begins with 'Get summary info for a GitHub repository' which is a specific verb plus resource, and lists concrete fields (description, stars, language, last push) that clearly distinguish it from the sibling tool recent_commits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus recent_commits, nor does it provide prerequisites or exclusions. Usage context must be inferred from the word 'summary' and the listed output fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_commitsB
List the most recent commit messages on a repository's default branch.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| limit | No | ||
| owner | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It usefully clarifies that only the default branch is inspected and that only messages are returned, but it does not mention ordering beyond 'most recent,' pagination, authentication needs, or rate-limit behavior. This is adequate but not richly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence that states the core behavior without filler or redundancy. Every word contributes meaning, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool, the description covers the main action and branch scope, and an output schema exists to describe return values. However, it leaves the limit parameter's semantics completely unaddressed and assumes the agent infers the standard owner/repo relationship, so the context is minimally sufficient rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description does not explain any of the three parameters (owner, repo, limit). It adds no meaning beyond the raw property names and default value already present in the input schema, so it fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('recent commit messages'), clearly scoping them to 'a repository's default branch.' This distinguishes it from the sibling get_repo, which is about repository metadata rather than commit messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when recent commit messages are needed, but it provides no explicit guidance about when not to use it or how it compares to the sibling get_repo. It does not include exclusions or alternative recommendations, so usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
get_repo - First observed
recent_commits
TDQS
Scored across 2 tools
get_repo and recent_commits are clearly distinct: one fetches repository metadata, the other lists recent commit messages. There is no ambiguity between them.
Both names use snake_case but follow different patterns: get_repo uses a verb_noun construction while recent_commits is an adjective_noun phrase. The inconsistency is minor but noticeable.
With only 2 tools, the server feels thin for a GitHub-related purpose. It is slightly under the typical well-scoped range, though acceptable for a narrow read-only trial.
The tools only cover repository metadata and recent commits. Obvious gaps like branches, issues, pull requests, and other common repository operations are missing, which would significantly hinder agents needing broader repo access.
Maintenance
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
A MCP server built for developers enabling Git based project management with project and personal…
Create, deploy, and operate MCP servers directly from your GitHub repositories.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables analyzing and querying GitHub repositories through the GitHub Chat API, allowing users to index repositories and ask questions about their code, architecture and tech stack.228 PyPI90MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides tools for interacting with the GitHub API, enabling AI assistants to query repositories, pull requests, issues, commits, users, and more.701 npmISC
- FlicenseNot gradedqualityDmaintenanceA read-only MCP server that exposes GitHub user profiles, repository info, and search via tools for AI assistants like Claude.-
- AlicenseAqualityDmaintenanceMCP server that enables AI assistants to look up and analyze GitHub repositories, including stars, forks, description, open issues, and README content.248 npmMIT