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.
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-mcpClients 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
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.
Resources
4 RESOURCESThe 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"
}
}Tools
3 TOOLSFunctions 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 / type | Rules |
|---|---|
formatstring | 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 / type | Rules |
|---|---|
categorystring | 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 / type | Rules |
|---|---|
technologystring | 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
}
]
}
}
}Prompts
1 PROMPTReusable 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 / type | Rules |
|---|---|
questionTypestring | Required. profile, skills or projects. |
userQuestionstring | 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."
}
}
]
}
}