adrian-capraru-mcp
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 cadi27tech.github.io. 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, USD, delivery days, what is included) and 3 paid consultations, as published 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.0.0.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, cadi27tech.github.io. 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_servicesServices and pricesARead-onlyIdempotent
Published offers with prices in USD: 12 fixed-price projects (3 tiers each, with delivery days and what is included) and 3 paid consultations. All are bought through his Upwork profile.
| 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, non-destructive, so safety is covered. The description still adds useful behavioral context not in the annotations: the result is a static published catalog of 12 projects × 3 tiers plus 3 consultations, priced in USD, and that acquisition happens externally through Upwork rather than through this tool.
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 resource and currency, followed by the concrete breakdown of what is offered. No filler or redundancy.
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 does much of the return-value work by enumerating the catalog composition and pricing currency, which is enough to set expectations. It stops short of describing actual field names or ordering, a minor gap for a static list tool.
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?
Zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly signals a no-argument full-catalog call rather than implying filtering options.
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 the specific resource and its contents precisely: published offers with USD prices, 12 fixed-price projects with 3 tiers each (including delivery days and inclusions), plus 3 paid consultations. This is clearly a catalog/service-listing tool and is distinguishable from siblings like list_case_studies or get_profile.
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 pricing/catalog lookup, and the closing sentence notes purchases happen via his Upwork profile, hinting that this is not a purchase tool. However, it never explicitly says when to call this versus how_to_hire or check_availability, nor any exclusion.
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 targets a clearly distinct resource: profile, case study list/detail, service offers, availability status, and hiring routes. The list/get split for case studies is explicit, and the availability tool is explicitly framed as a status note rather than a booking calendar. Minor duplication of 'open to' in profile and availability is clarified by the descriptions.
Most names follow a readable snake_case verb_noun pattern: get_profile, list_case_studies, get_case_study, list_services, check_availability. The one deviation is how_to_hire, which is a phrase rather than a verb-led action, though it remains clear and consistent in casing.
Six tools is well-scoped for a personal professional profile server. Each tool covers a meaningful content area, and there are no redundant or filler tools.
The surface covers the natural read-only lifecycle for this domain: general profile, detailed case studies with list/detail access, priced services, current availability, and contact/hiring routes. No create/update/delete operations are expected for a published personal profile, and no obvious content area is missing.
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- AlicenseAqualityBmaintenanceMCP 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