Skip to main content
Glama
moates695

moates-mcp

by moates695

moates-mcp

An MCP server that answers questions about Marcus Oates, a Sydney-based senior software engineer (voice AI & backend).

It's a proof of concept: any MCP client (Claude Desktop, Claude Code, an Agent SDK app) connects to the server and uses its tools to answer questions about Marcus. The client brings the LLM; this server just serves accurate, structured data (mirrored from https://moates.com.au) so the model doesn't have to guess.

Tools

Tool

Returns

get_profile

Name, title, location, summary, contact links

list_projects(status?)

Projects, optionally filtered by prod / test / poc

get_project(key)

Full detail for one project

get_experience

Work history with detailed highlights

get_skills

Tech stack, grouped

get_interests

Life outside work

get_resume

The whole profile as one markdown document

search(query)

Keyword search across experience, projects and skills

Also exposes a resume://marcus resource and an ask_about_marcus prompt.

Related MCP server: personal-context

Run locally

uv venv --python 3.12
uv pip install -e ".[dev]"

# stdio (quick local test, e.g. from Claude Desktop config)
uv run moates-mcp

# Streamable HTTP on 127.0.0.1:8000/mcp
MCP_HOST=0.0.0.0 uv run python -m moates_mcp --http

Run the tests with uv run pytest.

Connect a client

Claude Code (HTTP):

claude mcp add --transport http marcus https://mcp.moates.com.au/mcp

Claude Desktop (stdio) — add to claude_desktop_config.json:

{
  "mcpServers": {
    "marcus": { "command": "uv", "args": ["run", "moates-mcp"], "cwd": "/path/to/moates_mcp" }
  }
}

Deploy to a DigitalOcean droplet

The server speaks MCP's Streamable HTTP transport, so it deploys like any ASGI web app. See deploy/ for a Dockerfile, an nginx reverse-proxy config, and a systemd unit. In short:

  1. Point a subdomain (mcp.moates.com.au) at the droplet.

  2. Run the container (or the systemd service) listening on 127.0.0.1:8000.

  3. Front it with nginx + a Let's Encrypt cert on 443, proxying to /mcp.

Clients then connect to https://mcp.moates.com.au/mcp.

Available Tools

7 tools
get_educationA

Get Marcus's education: degrees, institutions, dates, results and highlights.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the burden of behavioral disclosure. It indicates a read operation ('Get') but does not mention safety, authentication, or rate limits. For a simple read tool, this is adequate but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence of 11 words. Every word contributes to the purpose, with no redundancy or wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, output schema present), the description sufficiently covers the output content. However, it could slightly enhance completeness by noting that this is a read-only operation or suggesting when to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters; the schema coverage is 100% trivial. The description adds value by enumerating the returned data components (degrees, institutions, dates, results, highlights), providing meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves Marcus's education data, listing specific components (degrees, institutions, dates, results, highlights). This differentiates it from sibling tools like get_experience or get_interests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for accessing education details but does not specify when to use this over other tools like get_profile or get_resume, or mention any alternative paths. No exclusions or context are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_experienceA

Get Marcus's work history: roles, companies, dates and detailed highlights.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It only hints at behavior ('detailed highlights') but does not disclose if the tool requires authentication, is read-only, or any side effects. Minimal behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-formed sentence with no wasted words. It is appropriately front-loaded. Could be slightly more informative but remains concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and existence of output schema, the description is adequate but lacks behavioral context that would be helpful without annotations. It covers purpose but not operational details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and schema coverage is 100%. Per rules, baseline is 4 since no param info needed. The description adds no param semantics but none are required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('Marcus's work history') and lists components ('roles, companies, dates and detailed highlights'). It clearly distinguishes from sibling tools that cover education, interests, profile, resume, projects, and search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context (when work history is needed) but does not explicitly state when to use this tool vs alternatives, nor does it provide exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_interestsA

Get what Marcus does outside of work (sport, training, hobbies).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description explains the scope of data returned (sport, training, hobbies). For a read-only tool with no side effects, this is sufficient, though explicit mention of being non-destructive would improve clarity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no redundant information. It efficiently conveys the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema), the description is complete. It clearly defines what data is retrieved, and no further details are necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, and the description adds value by describing the content categories, exceeding the baseline of 4 for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves Marcus's non-work activities, listing specific categories (sport, training, hobbies). This distinguishes it from siblings like get_experience or get_education, which focus on professional background.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly guides when to use: when needing interests outside work. It does not explicitly state when not to use or mention alternatives, but the sibling list provides context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_profileA

Get a high-level overview of Marcus: name, title, location, summary and contact links.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the burden. It describes the returned data but does not explicitly state read-only behavior, idempotency, or authentication needs. For a simple read operation, the lack of explicit behavioral disclosure is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action and resource, no unnecessary words. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no output schema, and no annotations, the description adequately covers the tool's purpose and return fields. Could mention it is read-only to improve completeness, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so baseline is 4. The description adds no parameter information, which is acceptable since none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it gets a high-level overview of Marcus and lists specific fields (name, title, location, summary, contact links). It distinguishes from sibling tools like get_education or get_experience by focusing on a broad profile overview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for getting a general profile summary, but does not explicitly contrast with alternatives like get_resume or search. No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_resumeA

Get Marcus's complete resume as a single markdown document (profile, experience, skills, projects).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the output format (markdown) and contents, but omits behavioral traits like read-only nature, authorization needs, or potential throttling. It adds moderate value but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-formed sentence that efficiently communicates the tool's purpose and output format without redundancy. Every part contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an existing output schema, the description is sufficiently complete. It identifies the result as a markdown document covering key sections, aligning with the context of sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is 100%. The description does not need to add parameter meaning. Baseline 4 is appropriate as no additional explanation is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves Marcus's complete resume as a single markdown document, listing included sections (profile, experience, skills, projects). This distinguishes it clearly from sibling tools like get_education or get_experience, which return partial data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for the full resume, contrasting with more specific sibling tools. However, it does not explicitly state when to use it versus alternatives, nor provide exclusions, but the context is clear enough for appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA

List Marcus's projects.

Args: status: Optional filter. One of "prod" (in production), "test" (in testing), or "poc" (proof of concept). Omit to list every project.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavior. It covers the filtering behavior but omits details like rate limits, authentication requirements, or pagination. However, it is a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise with two sentences and a formatted Args section. No fluff; every word is meaningful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema presumably present, the description does not need to explain return values. It covers the filtering logic adequately. Could mention invalid status handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema: it enumerates valid values for status and explains the default behavior when omitted. Schema description coverage is 0%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'List Marcus's projects' with a clear verb and resource. It distinguishes from sibling tools that retrieve specific items or search, making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: lists all projects or filters by status. Does not explicitly exclude alternatives, but siblings are different enough that confusion is unlikely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct aspect of Marcus's profile (education, experience, interests, high-level overview, full resume, projects with filtering, and free-text search). No two tools serve the same purpose, making it easy for an agent to select the right one.

Naming Consistency3/5

Most tools use 'get_' prefix, but 'list_projects' uses 'list_' and 'search' has no prefix. Additionally, some are singular (get_education, get_experience) while others are plural (get_interests, list_projects). The naming is clear but inconsistent in pattern.

Tool Count5/5

Seven tools is a well-scoped set for a personal profile server. Each tool serves a distinct function without unnecessary duplication or missing coverage, making the surface manageable and complete for its domain.

Completeness5/5

The server covers all major aspects of a personal portfolio: education, experience, projects (with status filtering), interests, a high-level profile, a full resume, and cross-cutting search. No obvious gaps; the search tool compensates for any missing granular queries.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes a person's structured professional profile as MCP tools, enabling Claude and other MCP clients to answer questions about that person based on real data.
    12
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Aggregates your digital footprint (GitHub, blogs, resume) into a single AI-readable profile and exposes it via MCP tools so AI agents can query your context live.
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes personal portfolio data as tools for Claude to answer questions about the developer, including profile, skills, experience, projects, and contact information.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/moates695/moates_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server