adrian-capraru-mcp
This MCP server provides read-only access to Adrian Capraru's professional profile, case studies, services, availability, and hiring contact routes.
Retrieve positioning, summary, roles, key figures, location, remote terms, languages, education, skills, and links with
get_profile.List all 7 case studies, including slugs, summaries, headline figures, and URLs, with
list_case_studies.Fetch one full case study by slug, including problem, build, measured results, stack, and links, with
get_case_study.View 12 fixed-price projects with 3 tiers each and 3 paid consultations, as published on Upwork, with
list_services.Check current availability status, update date, openness, and time zone with
check_availability.Get hiring contact routes (site, Upwork, LinkedIn, CV PDF), route guidance, and first-message advice with
how_to_hire.Use it safely: all tools are read-only, require no auth, make no network calls at runtime, and have no side effects.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@adrian-capraru-mcpHas Adrian shipped anything with Xero, and what would that build cost?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
adrian-capraru-mcp
An agent-readable profile. A small Model Context Protocol server that lets Claude, ChatGPT, Cursor or any MCP client answer questions about Adrian Capraru, Head of AI & Automation, and hand a user the routes to hire him: who he is, what he has built and measured, what his published offers cost, whether he is taking work, and where to make contact.
Every answer comes from the data behind adriancapraru.com. A build script generates data/profile.json from the site's own content file, its JSON Resume and the published Upwork offers, so the server says what the site says and nothing else.
Registry: official MCP Registry,
io.github.cadi27tech/adrian-capraru(registry entry), active since 27 Oct 2026Transport: stdio. Runs with
npx github:cadi27tech/adrian-capraru-mcp, or as the MCPB bundle attached to each releaseAuth and network: none. No key, no account, no outbound call at runtime, nothing written
Side effects: none.
how_to_hirereturns contact routes; it never sends a message or books a call
Tools
All six are read-only (readOnlyHint: true, openWorldHint: false).
Tool | Returns |
| Positioning, summary, all 8 roles with highlights and key figures, location (Romania, EET) and remote terms, what he is open to, languages, education, skills, links |
| The 7 case studies on the site: slug, title, summary, headline figure, status, URL |
| One case in full: client type, role, timeline, status, problem, what was built, measured results, stack, links. |
| 12 fixed-price projects (3 tiers each, delivery days, what is included) and 3 consultations, as published on Upwork; prices are quoted on Upwork |
| The status in |
| Contact page, Upwork profile, LinkedIn and CV PDF, what each route is for, and what to put in a first message |
Then ask, for example: "Has Adrian Capraru shipped anything with Xero in production, and what would a HubSpot to Xero build cost?"
Related MCP server: subcue-mcp
Connect
Node 20 or later. The first run installs the package from GitHub.
Claude Code
claude mcp add adrian-capraru -- npx -y github:cadi27tech/adrian-capraru-mcpClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"adrian-capraru": {
"command": "npx",
"args": ["-y", "github:cadi27tech/adrian-capraru-mcp"]
}
}
}Or download adrian-capraru-mcp-1.1.1.mcpb from the latest release and open it: Claude Desktop installs bundles in one click.
Cursor (~/.cursor/mcp.json, or .cursor/mcp.json in a project)
{
"mcpServers": {
"adrian-capraru": {
"command": "npx",
"args": ["-y", "github:cadi27tech/adrian-capraru-mcp"]
}
}
}On Windows, if the client cannot find npx, use "command": "cmd" with "args": ["/c", "npx", "-y", "github:cadi27tech/adrian-capraru-mcp"].
Any client, from a clone: npm ci, then node examples/call.mjs <tool> '<json arguments>' starts the server over stdio, calls one tool and prints what the agent reads back.
Verification
npm test starts the real server over stdio and calls every tool the way an MCP client does: exactly six tools and all read-only, the profile fields, all 7 case slugs, an unknown slug refused, 12 projects with three rising price tiers and 3 consultations, the availability file, the four contact routes, and two repository checks. CI runs it on Node 20 and 22 on every push, then calls how_to_hire from a clean install.
Design decisions
Generated, never typed. scripts/build-data.mjs imports the site's content.mjs, reads resume.json, lifts the "Open to" and "Where" copy from the contact page source and parses the published Upwork catalog and consultations. A wording change on the site reaches the server on the next build. If the contact page loses a section the script depends on, the build throws instead of shipping a gap.
Content rules that fail the build. scripts/rules.mjs lists what may never be published: partner names, superlatives, figures withheld on purpose, email addresses, first-person copy, hype words and any dash other than the ASCII hyphen. The build rewrites the few site sentences that carry such a fact, drops any list item still failing, then checks the whole output and refuses to write it if one rule still fails. The tests run the same rules over the data, the README and the changelog.
Availability is a file, not a calendar. availability.json holds a status, a sentence and a date, edited by hand and read on every call, so an edit applies without a restart. The server never claims a free slot it cannot see.
Contact stays human. The server hands back routes and a suggested brief. A person, or an agent acting for one, makes contact. Nothing here can send a message in Adrian's name or on a user's behalf.
Update the data
node scripts/build-data.mjs "<folder holding website/ and deliverables/upwork-v3/>"
npm testTo change availability, edit availability.json (status, summary, updated) and push. Clients running through npx pick it up on the next install; the registry bundle changes only with a release.
A new release: bump version in package.json, manifest.json and server.json, run npx @anthropic-ai/mcpb pack, attach the .mcpb to a GitHub release, put its SHA-256 and URL in server.json, then run the publish to MCP Registry workflow. It checks the hash and signs in with GitHub OIDC, so no secret is stored.
Licence
MIT. Adrian Capraru, adriancapraru.com. The drawing is generated with blueprint-svg.
Available Tools
6 toolscheck_availabilityAvailabilityARead-onlyIdempotent
Current availability status, as he last set it, with the date it was updated, what he is open to and his time zone. A status note, not a booking calendar.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuinely new behavioral context — that the value is user-set ('as he last set it'), carries its own last-updated timestamp, and is a status note rather than a live calendar. This staleness/freshness framing is exactly the kind of disclosure annotations can't express.
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?
Two short sentences with zero filler, front-loaded with what the caller receives and finished with the key scope caveat. Every clause (status, date, openness, time zone, not-a-calendar) carries distinct information.
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?
With no output schema, the description must convey the return shape, and it does so field-by-field. A simple zero-arg read-only tool needs little more; only the absence of sibling context keeps it from a 5.
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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies.
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?
States a specific verb+resource — returns the current availability status — and enumerates the contents (status, update date, what he's open to, time zone). The closing line 'A status note, not a booking calendar' sharply warns what it isn't, but it never mentions how it differs from siblings like get_profile or how_to_hire, which is the remaining gap.
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?
Usage is only implied: the 'not a booking calendar' exclusion tells an agent this is not for scheduling, which is useful negative scope. However, no positive 'use this when…' signal or named alternative (e.g., get_profile for broader bio data) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_case_studyCase studyARead-onlyIdempotent
One case study in full: client type, role, timeline, status, the problem, what was built, measured results, stack and links.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Case study slug, from list_case_studies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is read-only, idempotent, non-destructive, and not open-world, so the safety profile is covered. The description adds useful context by enumerating the fields returned, but it does not describe other behavioral details such as error handling for invalid slugs.
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?
The description is a single compact sentence with no wasted wording. It front-loads the core purpose and then efficiently lists the returned content.
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 one-parameter read operation with rich annotations and full schema coverage, the description supplies the important missing information: what a full case study includes. No output schema exists, so enumerating the returned fields is especially valuable and sufficient for correct invocation.
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 single slug parameter is fully documented in the schema with an enum of valid values and a note that it comes from list_case_studies. The description itself adds no parameter guidance, so it relies on the schema as expected when schema coverage is high.
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 clearly states that this retrieves exactly one case study in full, and it enumerates the content included: client type, role, timeline, status, problem, build, results, stack, and links. This distinguishes it from the sibling list_case_studies, which returns the list rather than the full record.
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?
Usage is implied: use this to get full details for a single case study when the slug is known. The description does not explicitly say when to use this versus list_case_studies or what to do if the slug is unknown, though the schema notes the slug comes from list_case_studies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileProfileARead-onlyIdempotent
Positioning, summary, every role with highlights and key figures, location and remote terms, what he is open to, languages, education, skills and links (site, CV PDF, LinkedIn, GitHub, Upwork).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety and cacheability are covered. The description adds that this is a single full-dump call covering all profile facets (no filtering or pagination mentioned), which is useful, but it says nothing about response shape, size, or freshness.
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 sentence, front-loaded with the highest-value items (positioning, summary, roles) and then the long tail. It is a fragment without an explicit verb, and the trailing link list is slightly padded, but every clause maps to real returned content.
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?
With no output schema and no parameters, the description carries the burden of telling the agent what comes back, and it does so thoroughly across all facets. Only the structure of the returned object (flat fields vs. nested sections) and overall size are left unspecified.
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 tool takes zero parameters, so there is nothing for the description to clarify; baseline 4 applies. The field enumeration helpfully signals what comes back even though no inputs exist.
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 enumerates exactly what the tool returns (positioning, summary, roles, location, availability, languages, education, skills, links), so the resource is unmistakable and it identifies the subject as a personal profile ('what he is open to'). It does not explicitly differentiate from siblings like list_services or how_to_hire, but the enumerated content already makes overlap unlikely.
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?
Usage is only implied: an agent can infer this is the entry point for background/about-the-person information. There is no explicit 'use this when...' or exclusion such as 'for availability use check_availability' or 'for engagement terms use how_to_hire', despite those siblings being the most likely confusion points.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
how_to_hireHow to hireARead-onlyIdempotent
Contact routes: the site contact page, his Upwork profile, LinkedIn and the CV PDF, with what each route is for and what to include in a first message. This tool sends nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered structurally. The description adds one genuinely useful clarification — 'This tool sends nothing' — which prevents an agent from treating it as an outreach action, but it says nothing about the return shape (URLs vs. free text) or that the content is static reference material.
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?
Two short clauses, front-loaded with the resource list and closing with the key negative guarantee. Every element earns its place; only the missing explicit verb keeps it from being model-tight.
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?
With zero parameters, no output schema and rich annotations, the description covers everything an agent needs: what content comes back, what each route is for, and that no message is sent. Nothing required for correct invocation is absent.
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 tool takes zero parameters and the schema coverage is 100%, so there is nothing for the description to disambiguate. The baseline for a no-parameter tool applies, with no parameter-level gaps introduced.
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 names the concrete resource being returned — contact routes (site contact page, Upwork, LinkedIn, CV PDF) plus what to include in a first message — which is specific enough to distinguish it from siblings like get_profile or check_availability. What it lacks is an explicit verb ('returns'/'describes'), so the agent has to infer it is an informational lookup rather than an action.
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?
Usage is only implied: the enumeration of contact routes signals 'call this when you want to reach the owner', and 'This tool sends nothing' hints at the boundary of the tool. There is no explicit when-to-use/when-not or routing to a sibling (e.g. 'use check_availability to see if he is free before contacting').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_case_studiesCase studiesARead-onlyIdempotent
The 7 case studies on his site: slug, title, one-paragraph summary, headline figure and URL. Pass a slug to get_case_study for the full write-up.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds behavior beyond that: the fixed cardinality (7) and the exact shape of each returned record, which tells the agent it can rely on a small, stable, field-structured payload. Minor gap: no statement about ordering or whether the set can change.
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?
Two sentences, zero waste. The return shape is front-loaded and the routing hint follows, so an agent gets the essential fact first.
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?
There is no output schema, so the description carries the burden of describing return values, and it does so field by field. For a no-parameter, read-only listing tool that is nearly complete; only ordering/stability of the list is unstated, which is low risk.
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 tool takes zero parameters, which is the baseline-4 case. The description is consistent with that — it never implies a filter or argument, and the mention of a slug is correctly attributed to the sibling get_case_study rather than to this tool.
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?
States a specific verb+resource (lists the 7 case studies) and enumerates exactly what each entry contains (slug, title, summary, headline figure, URL). It also names the sibling it is not: get_case_study returns the full write-up, so an agent can distinguish the index from the detail tool immediately.
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 second sentence routes the agent explicitly: use this to enumerate, then pass a slug to get_case_study for the full write-up. That is a clear use/alternative pairing. It stops short of an explicit exclusion (e.g. 'do not use this if you already know the slug'), so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesServicesARead-onlyIdempotent
Published offers: 12 fixed-price projects (3 tiers each, with delivery days and what is included) and 3 consultations. Prices are quoted on his Upwork profile or after a discovery call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so safety needs no restating. The description adds real value beyond them by disclosing the return content structure — project counts, three-tier packaging, delivery days, what is included — plus a boundary note that pricing is not included and lives elsewhere. It does not describe ordering or formatting, which is a minor residual gap.
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?
Two tight sentences, front-loaded with the inventory of offers, then a short boundary note on pricing. Every clause earns its place; nothing is redundant with annotations or schema.
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?
With no parameters and no output schema, the description must convey what comes back, and it does so concretely (counts, tier structure, inclusions). Safety and determinism are handled by annotations. An agent could call this correctly, though it would have to guess the relationship to how_to_hire and check_availability.
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 zero parameters and 100% coverage, so there is nothing for the description to disambiguate. Baseline 4 applies.
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 names the resource precisely — 'Published offers' — and enumerates its shape (12 fixed-price projects with 3 tiers, delivery days, inclusions, plus 3 consultations), so an agent knows exactly what this returns. It stops short of an explicit verb or a direct contrast with siblings like how_to_hire or check_availability.
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?
Usage is only implied: an agent must infer that this is the browse-the-catalog call while how_to_hire handles the hiring process and check_availability handles scheduling. The line about prices being on the Upwork profile or after a discovery call hints at where this tool's coverage ends, but no alternative sibling is named and no when-not condition is stated.
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.
6 tool updates
v1.0.0- First observed
check_availability - First observed
get_case_study - First observed
get_profile - First observed
how_to_hire - First observed
list_case_studies - First observed
list_services
TDQS
Scored across 6 tools
Each tool has a distinct role: browsing services, checking availability, listing or fetching case studies, getting contact routes, and retrieving the profile. The only minor overlap is that both check_availability and get_profile mention what Adrian is open to, but the descriptions make the boundary clear enough.
Most tools follow a predictable verb_noun pattern (list_services, check_availability, get_case_study, list_case_studies, get_profile). The one deviation is how_to_hire, which is a phrase rather than a verb_noun name, but it remains clear and readable.
Six tools is well-scoped for a personal professional profile server. Each tool covers a distinct area of information and none feels redundant or excessive.
The surface covers the core domain comprehensively: services, availability status, case study index and detail, hiring/contact routes, and full profile information. The explicit note that check_availability is not a booking calendar and how_to_hire sends nothing indicates intentional, non-dead-end boundaries.
Maintenance
Related MCP Connectors
Read-only MCP server for Mark Siazon's professional profile: projects, FAQ, proof, availability.
Read-only MCP server that answers questions about turva.dev from its published data. Five tools return JSON: the service catalog with prices, contact and operator details, engagement principles and dated agent-readiness and security evidence with verification links. Connect over Streamable HTTP. You need no API key. The server does not scan other websites or run audits.
Public portfolio MCP for resume, services, availability, project evidence, and introductions.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAn MCP server that provides a structured API for AI agents to query a person's resume, including profile, projects, writing, and gated access to experience and skills.MIT

subcue-mcpofficial
AlicenseNot gradedqualityCmaintenancePublic read-only MCP server for SubcueAI, the AI interview assistant for macOS and Windows. Exposes live pricing and the latest desktop version as tools, plus product overview and FAQ resources. Includes a zero-dependency stdio bridge and Dockerfile.1MIT- AlicenseAqualityDmaintenanceMCP server that exposes a resume as callable tools and resources, enabling AI agents to query experience, skills, projects, and contact information via natural language.3ISC
- AlicenseNot gradedqualityDmaintenanceMCP server for exploring a software developer's portfolio: lists projects, semantically searches code, explains architecture, summarizes READMEs, and answers questions through a natural-language agent, with a built-in web playground.MIT