THE WORLD'S LEAST REQUESTED SaaS PRODUCT

Finally.
Thomas as a Service.

One human. Unlimited questions. None of the awkward small talk.

A personal Model Context Protocol server that lets AI assistants explore my professional background, skills and projects. Because apparently a website, a CV and LinkedIn weren't enough.

100% ORGANIC INTELLIGENCE · DIGITALLY DISTRIBUTEDNO REST API PRETENDING TO BE AN MCP

PROTOCOL, NOT PERSONALITY TEST

Connect to my digital alter ego.

A genuinely useful MCP server hidden inside a wildly unnecessary product launch.

STREAMABLE HTTP · MCP ENDPOINT

https://mcp.thomasclausen.dk/me-myself-and-mcp

Clients discover capabilities through MCP, including tools/list, resources/list and prompts/list. These are protocol methods, not REST routes.

CONCEPT PREVIEW — URL NOT YET VERIFIED LIVE

THE HUMAN, DOCUMENTED

Read the docs.
Know the Thomas.

Professional context, callable tools and reusable prompts. Everything an AI assistant needs to ask better questions about one very specific human. Procurement department optional.

me-mcp / 1.0.0 · 4 resources · 3 tools · 1 prompt

These examples are JSON-RPC messages sent through an MCP client to the server endpoint. Resource URIs and method names are MCP identifiers, not separate web addresses. Copying an example does not send it. Results below are generated from the supplied project data, rather than a live server request.

01

Resources

4 RESOURCES

The reading material. Structured context a client can retrieve and make available to an assistant. Less coffee required than a first meeting. Discover the catalogue with resources/list.

RESOURCEme://profile

WHAT YOU GET

Professional background, headline, summary, focus areas, contact information and links. The introduction, without the calendar invitation.

MCP METHOD

resources/read

Registered name: profile
MIME type: application/json
Returns one text content entry containing the profile as JSON.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resources/read",
  "params": {
    "uri": "me://profile"
  }
}
RESOURCEme://skills

WHAT YOU GET

Skills grouped by category, including proficiency levels and related project IDs. For when “does frontend” is a little too vague.

MCP METHOD

resources/read

Registered name: skills
MIME type: application/json
Returns one text content entry containing a JSON object with a categories array.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resources/read",
  "params": {
    "uri": "me://skills"
  }
}
RESOURCEme://projects

WHAT YOU GET

Projects with descriptions, organisations, technology stacks, links and associated markdown details. The evidence behind the introduction.

MCP METHOD

resources/read

Registered name: projects
MIME type: application/json
Returns a JSON object with a projects array. Each project includes detailsMarkdown: associated markdown, or null when no details file is supplied.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resources/read",
  "params": {
    "uri": "me://projects"
  }
}
RESOURCEme://bio-markdown

WHAT YOU GET

The long-form biography, served as Markdown. For assistants who believe the short version raises more questions.

MCP METHOD

resources/read

Registered name: bio-markdown
MIME type: text/markdown
Returns one text content entry containing the biography Markdown.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resources/read",
  "params": {
    "uri": "me://bio-markdown"
  }
}
02

Tools

3 TOOLS

Functions an assistant can call through an MCP client. Discover input schemas with tools/list; call a tool by name using tools/call. No tiny REST endpoints hiding in a trench coat.

TOOLget_profile_summary

WHAT YOU GET

A short or long profile summary. Professionally useful. Mercifully shorter than an autobiography.

MCP METHOD

tools/call

ARGUMENTS

Name / typeRules
format
string
Optional. short or long. Defaults to short.

Returns { format, summary } in structuredContent and a labelled JSON version in text content. The long format appends the profile’s focus areas.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_profile_summary",
    "arguments": {
      "format": "short"
    }
  }
}
Example result · bundled data

Example result

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Profile summary\n{\n  \"format\": \"short\",\n  \"summary\": \"Thomas Clausen — Frontend developer building for the web using modern JavaScript. I build maintainable web applications while having a strong focus on humorous naming conventions, hiding easter eggs and learning how to properly use dashes. But in all seriousness I am a frontend developer with many years of professional frontend experience. My background combines agency website development with software development. I work with HTML, CSS, JavaScript, Vue, Nuxt and TypeScript, reusable components, state management and REST APIs. I bring experience with web-based GIS, accessibility and usability, alongside a taste for playful web experiments. I am also exploring MCP through a small prototype using profile, project and skill data.\"\n}"
      }
    ],
    "structuredContent": {
      "format": "short",
      "summary": "Thomas Clausen — Frontend developer building for the web using modern JavaScript. I build maintainable web applications while having a strong focus on humorous naming conventions, hiding easter eggs and learning how to properly use dashes. But in all seriousness I am a frontend developer with many years of professional frontend experience. My background combines agency website development with software development. I work with HTML, CSS, JavaScript, Vue, Nuxt and TypeScript, reusable components, state management and REST APIs. I bring experience with web-based GIS, accessibility and usability, alongside a taste for playful web experiments. I am also exploring MCP through a small prototype using profile, project and skill data."
    }
  }
}
TOOLlist_skills

WHAT YOU GET

List skills, optionally filtering category names. The technical reading list, trimmed to the question at hand.

MCP METHOD

tools/call

ARGUMENTS

Name / typeRules
category
string
Optional. At least one character when supplied. Filters category names, rather than individual skill names.

Category matching uses a case-insensitive substring. Omit category to return all categories; no match returns an empty categories array. Results include both text content and structuredContent.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_skills",
    "arguments": {
      "category": "GIS"
    }
  }
}
Example result · bundled data

Example result

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Skills\n{\n  \"categories\": [\n    {\n      \"name\": \"GIS\",\n      \"items\": [\n        {\n          \"name\": \"WMS\",\n          \"level\": \"intermediate\",\n          \"projectIds\": [\n            \"niras-astra\",\n            \"niras-iot-portal\",\n            \"niras-rehab-it\"\n          ]\n        },\n        {\n          \"name\": \"WMTS\",\n          \"level\": \"intermediate\",\n          \"projectIds\": [\n            \"niras-astra\",\n            \"niras-iot-portal\",\n            \"niras-rehab-it\"\n          ]\n        },\n        {\n          \"name\": \"WFS\",\n          \"level\": \"beginner\",\n          \"projectIds\": []\n        },\n        {\n          \"name\": \"Datafordeler\",\n          \"level\": \"intermediate\",\n          \"projectIds\": [\n            \"niras-astra\",\n            \"niras-iot-portal\",\n            \"niras-rehab-it\"\n          ]\n        },\n        {\n          \"name\": \"Dataforsyningen\",\n          \"level\": \"intermediate\",\n          \"projectIds\": [\n            \"niras-astra\",\n            \"niras-iot-portal\",\n            \"niras-rehab-it\"\n          ]\n        },\n        {\n          \"name\": \"GeoServer\",\n          \"level\": \"beginner\",\n          \"projectIds\": [\n            \"niras-astra\",\n            \"niras-rehab-it\"\n          ]\n        },\n        {\n          \"name\": \"KortInfo\",\n          \"level\": \"beginner\",\n          \"projectIds\": [\n            \"niras-astra\"\n          ]\n        },\n        {\n          \"name\": \"QGIS\",\n          \"level\": \"beginner\",\n          \"projectIds\": []\n        }\n      ]\n    }\n  ]\n}"
      }
    ],
    "structuredContent": {
      "categories": [
        {
          "name": "GIS",
          "items": [
            {
              "name": "WMS",
              "level": "intermediate",
              "projectIds": [
                "niras-astra",
                "niras-iot-portal",
                "niras-rehab-it"
              ]
            },
            {
              "name": "WMTS",
              "level": "intermediate",
              "projectIds": [
                "niras-astra",
                "niras-iot-portal",
                "niras-rehab-it"
              ]
            },
            {
              "name": "WFS",
              "level": "beginner",
              "projectIds": []
            },
            {
              "name": "Datafordeler",
              "level": "intermediate",
              "projectIds": [
                "niras-astra",
                "niras-iot-portal",
                "niras-rehab-it"
              ]
            },
            {
              "name": "Dataforsyningen",
              "level": "intermediate",
              "projectIds": [
                "niras-astra",
                "niras-iot-portal",
                "niras-rehab-it"
              ]
            },
            {
              "name": "GeoServer",
              "level": "beginner",
              "projectIds": [
                "niras-astra",
                "niras-rehab-it"
              ]
            },
            {
              "name": "KortInfo",
              "level": "beginner",
              "projectIds": [
                "niras-astra"
              ]
            },
            {
              "name": "QGIS",
              "level": "beginner",
              "projectIds": []
            }
          ]
        }
      ]
    }
  }
}
TOOLlist_projects

WHAT YOU GET

List projects, optionally filtering by technology. Find relevant experience without reading the whole back catalogue.

MCP METHOD

tools/call

ARGUMENTS

Name / typeRules
technology
string
Optional. At least one character when supplied. A project matches if any stack entry contains the value.

Matches case-insensitive substrings in each project’s stack. Omit technology to return all projects; no match returns an empty projects array. Results include both text content and structuredContent.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_projects",
    "arguments": {
      "technology": "TypeScript"
    }
  }
}
Example result · bundled data

Example result

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Projects\n{\n  \"projects\": [\n    {\n      \"id\": \"niras-iot-portal\",\n      \"name\": \"IoT platform\",\n      \"description\": \"Display of raw meter data — including position data and time series for individual sensors. Measurements can include water level, temperature, pressure and more.\",\n      \"link\": \"https://www.niras.dk/sektorer/data-digitalisering/iot-og-sensorer/\",\n      \"stack\": [\n        \"Nuxt\",\n        \"Vuex\",\n        \"TypeScript\",\n        \"JavaScript\",\n        \"CSS\",\n        \"HTML\",\n        \"OpenLayers\"\n      ],\n      \"organisation\": \"NIRAS\",\n      \"detailsMarkdown\": null\n    }\n  ]\n}"
      }
    ],
    "structuredContent": {
      "projects": [
        {
          "id": "niras-iot-portal",
          "name": "IoT platform",
          "description": "Display of raw meter data — including position data and time series for individual sensors. Measurements can include water level, temperature, pressure and more.",
          "link": "https://www.niras.dk/sektorer/data-digitalisering/iot-og-sensorer/",
          "stack": [
            "Nuxt",
            "Vuex",
            "TypeScript",
            "JavaScript",
            "CSS",
            "HTML",
            "OpenLayers"
          ],
          "organisation": "NIRAS",
          "detailsMarkdown": null
        }
      ]
    }
  }
}
03

Prompts

1 PROMPT

Reusable instructions a user can choose through a supporting client. Discover templates with prompts/list and retrieve their messages with prompts/get. A starting point for the conversation.

PROMPTanswer-about-thomas

WHAT YOU GET

Prepare a message for answering questions about Thomas using the server’s resources and tools. Returns instructions for an assistant; the assistant produces the answer.

MCP METHOD

prompts/get

ARGUMENTS

Name / typeRules
questionType
string
Required. profile, skills or projects.
userQuestion
string
Required. At least one character.

Returns one user message containing the question type, the question and an instruction to use me-MCP resources and tools.

Example request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "prompts/get",
  "params": {
    "name": "answer-about-thomas",
    "arguments": {
      "questionType": "skills",
      "userQuestion": "Which frontend technologies does Thomas work with?"
    }
  }
}
Example result · bundled data

Example result

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "messages": [
      {
        "role": "user",
        "content": {
          "type": "text",
          "text": "Question type: skills\nUser question: Which frontend technologies does Thomas work with?\nAnswer using me-MCP resources and tools."
        }
      }
    ]
  }
}