Bo Kendell — Portfolio
Server Details
Bo Kendell's portfolio: projects, writing, work history, resume, and live activity.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- bokendell/bokendell
- GitHub Stars
- 0
TDQS
Scored across 8 tools
Most tools target clearly distinct resources: profile, experience, projects, posts, tech stack, and activity. Minor confusion exists because get_experience overlaps somewhat with projects, and the get_post/list_posts pair is muddled by list_posts directing callers to get_post for the 'full body' when get_post actually returns only metadata.
The get_/list_ convention is applied consistently, with singular get_ for individual resources and plural list_ for collections. This creates a predictable, easy-to-navigate pattern across all eight tools.
Eight tools is well-scoped for a portfolio server. Each tool covers a meaningful section of a personal site without unnecessary fragmentation or bloat.
The server covers the main portfolio surface well: profile, experience, projects, tech stack, posts, and GitHub/LeetCode activity. The main gap is that get_post only returns metadata and the post body is not available through the MCP server, despite list_posts implying it is.
Available Tools
8 toolsget_activityGet live activityARead-onlyIdempotentInspect
Current GitHub contributions + LeetCode stats. Changes throughout the day — call fresh each time rather than caching.
| 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, and destructiveHint as safe. The description adds genuinely useful behavioral insight beyond those annotations: the data is dynamic and should not be cached, implying that repeated calls may return different results. This helps the agent make a freshness decision that annotations alone would not convey.
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 two short sentences with no filler. The first sentence front-loads the core purpose, and the second provides actionable freshness guidance. Every word earns its place.
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 no-parameter, read-only tool without an output schema, the description conveys the key data types (GitHub contributions and LeetCode stats) and the time-sensitive behavior. It could slightly expand on the exact response shape, but that is unnecessary for correct invocation and selection.
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 has zero parameters and schema coverage is 100% by default. The description adds no parameter-level detail, but none is needed. The baseline of 4 for a no-parameter tool is appropriate because there is no semantic gap to fill.
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 identifies the exact resource: 'Current GitHub contributions + LeetCode stats.' Although there is no explicit verb, the tool name and title ('get_activity', 'Get live activity') make the retrieval action unambiguous. It is clearly distinct from sibling tools like get_experience, get_profile, and list_posts.
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 description gives clear usage context: data changes throughout the day, so the agent should call fresh each time rather than caching. It does not mention alternatives or exclusions, but this is a unique read tool with no direct sibling overlap, so absence of explicit comparison is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_experienceGet experience timelineBRead-onlyIdempotentInspect
Employment, education, projects, certifications, and awards — the full timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive operation, so the description needs only to add behavioral context. It adds that the result is a timeline of experience categories and implies chronological ordering, but it does not explain whether the optional type parameter filters the timeline or how results are structured.
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 phrase that lists all relevant categories with no filler. The 'full timeline' qualifier is front-loaded and communicates scope efficiently.
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?
Given the simple optional enum parameter and comprehensive safety annotations, the description provides adequate basic context. It leaves out explicit filter semantics and return-value structure, which is a gap because there is no output schema, but the tool's simplicity keeps this from being severely incomplete.
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 description restates the enum values (employment, education, projects, certifications, awards) in prose, which partially compensates for the 0% schema description coverage. However, it does not clarify the effect of the optional type parameter (filter vs. select) or default behavior when omitted.
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 title and description clearly indicate this tool retrieves a complete experience timeline covering employment, education, projects, certifications, and awards. The resource is specific, but the description does not explicitly contrast it with sibling tools like get_project or list_projects, so it lacks explicit differentiation.
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?
There is no guidance on when to use this tool instead of alternatives such as get_project or list_projects. The phrase 'full timeline' implies comprehensiveness, but that connection is left to the agent to infer, and no exclusions or alternative triggers are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postGet post by slugARead-onlyIdempotentInspect
Full post metadata by slug (MDX body is served by the app routes).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds the behavioral scoping that the response is metadata only and excludes MDX body, which is useful. It does not detail response fields or not-found behavior, so the added context is moderate.
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, front-loaded sentence conveys the purpose and a key limitation without waste. The parenthetical is compact and prevents a likely mis-call for MDX 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 single-parameter read tool with comprehensive safety annotations, the description sufficiently covers what is returned (metadata) and what is not (MDX body). It lacks specifics about available metadata fields or error behavior, but the simplicity of the tool lowers the necessity for more.
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 fully describes the slug parameter with 100% coverage, so the description adds no new parameter semantics. It merely references the slug concept already captured in the schema. Baseline 3 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 clearly states the tool retrieves full post metadata by slug, which is a specific verb-resource pairing. The parenthetical exclusion of MDX body makes the scope precise and distinguishes it from content-serving routes and list_posts.
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 tool's usage is clear: use it to fetch post metadata by slug. It also provides an explicit when-not by stating MDX body is served by app routes, preventing misuse. However, it does not explicitly name alternative sibling tools such as list_posts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileGet profileARead-onlyIdempotentInspect
Bo's name, bio, current role, social links. The canonical 'who is this person' summary.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds useful behavioral context by specifying exactly which profile fields are returned, even though it does not discuss output formatting or edge cases; for a simple zero-parameter getter this is sufficient.
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 extremely concise: one sentence enumerates the content, and one sentence frames its role as canonical. Every word earns its place, and the key information is front-loaded.
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 read-only, zero-parameter profile getter with annotations covering side effects, the description is nearly complete. It does not mention an output schema or any special return conventions, but none are indicated as necessary for this simple, well-scoped 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?
There are no parameters, so the description carries no burden of explaining arguments. The field listing adds semantic meaning about what the tool returns, which is relevant even without an input schema. This matches the baseline for zero-parameter tools.
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 states a specific resource (Bo's profile) and lists the contained fields: name, bio, current role, and social links. Calling it 'the canonical who is this person summary' gives it a clear identity among siblings, but it does not explicitly differentiate from get_activity or get_experience by naming them.
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 phrase 'the canonical who is this person summary' implies this tool is the go-to for a broad personal overview, which gives some usage direction. However, there is no explicit statement about when to choose this over get_activity, get_experience, or other sibling tools, so the guidance remains implicit rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet project by slugARead-onlyIdempotentInspect
Full project detail — full description, tech stack, links, status.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Project slug (e.g. 'warm-machine'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds what fields are returned, which is useful, but it does not disclose error behavior, authentication needs, or other non-obvious behavior. Nothing contradicts the annotations.
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, efficient sentence that front-loads the main purpose and then lists the included content categories. There is no filler, repetition, or unnecessary detail.
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-only getter with complete schema coverage and strong annotations, the description is mostly sufficient. It tells the agent what will be returned, though it could be strengthened by explicitly stating that it returns a single project object and that the lookup is by slug, rather than leaving those to the title and schema.
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 only parameter, slug, is already fully described in the schema with an example, and schema description coverage is 100%. The description does not add any additional meaning or format detail beyond what the schema already provides, so it stays at the baseline.
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 states a clear verb and resource ('full project detail') and enumerates what is included: description, tech stack, links, and status. It does not explicitly differentiate from sibling tools, but the field list hints that it is broader than get_tech_stack and distinct from list_projects.
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 phrase 'full project detail' implies this tool is for fetching a complete project record for a single slug, but there is no explicit guidance on when to use it instead of list_projects or get_tech_stack. Usage context is only implicit, not stated as a recommendation or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tech_stackGet tech stackARead-onlyIdempotentInspect
Technologies Bo works with, grouped by category.
| 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, and destructiveHint, covering side-effect safety. The description adds that the result is grouped by category, which is useful output context, but it does not describe the exact output shape, possible categories, or empty-result behavior.
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 short sentence that conveys the resource and its grouping with no filler. Every word contributes to understanding, and the key information is front-loaded.
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 zero-parameter, read-only, idempotent tool with a simple output, the description is sufficient for selection and basic expectations. It could be slightly more explicit about the returned data structure, but the lack of output schema and low complexity keep this gap minor.
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 has zero parameters, so there are no parameter semantics to document. The baseline of 4 applies, and the description does not need to add parameter-specific detail.
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 identifies a specific resource—Bo's technologies—and adds that they are grouped by category, which differentiates it from sibling tools like get_profile or get_project. It lacks an explicit verb such as 'returns' or 'retrieves,' but the tool name and title supply the action clearly.
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 by the resource name: an agent would select this when it needs Bo's tech stack. However, there is no explicit statement of when to use it versus alternatives, no exclusions, and no guidance about related tools such as get_experience or get_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsList postsARead-onlyIdempotentInspect
Published posts, newest first. Returns metadata only — call get_post for the full body.
| 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, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context: it filters to published posts, orders newest first, and limits output to metadata. While it does not mention pagination or limits, the description meaningfully supplements the annotations.
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 no filler. The most important behavioral facts — published posts, ordering, and metadata-only output — are front-loaded, and the pointer to get_post is concise.
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 zero-parameter list tool with annotations covering safety, the description fully equips an agent to select and invoke it correctly. It states what is returned, how results are ordered, what is excluded, and where to go for the full body.
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 has zero parameters and schema coverage is 100%, so the schema carries no burden. The description adds relevant output semantics by saying it returns metadata only, which is more than needed for a parameterless 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?
The description uses a specific verb-resource pairing ('list posts') and immediately defines the scope: published posts, newest first. It also differentiates itself from get_post by clarifying that it returns metadata only, not the full body.
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 description explicitly tells the agent when to use this tool versus get_post: use list_posts for metadata, use get_post for the full body. This direct routing to a sibling tool is clear and leaves no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-onlyIdempotentInspect
Return every portfolio project (title, brief description, lifecycle, tech stack). Use get_project for the full body + screenshots.
| Name | Required | Description | Default |
|---|---|---|---|
| lifecycle | No | Filter by lifecycle. Omit to return all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the 'every' scope and a summary of returned fields, which is useful, but it does not disclose ordering, pagination, or any other behavioral traits beyond what annotations already indicate.
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 with no filler. The main purpose and returned content are front-loaded, and the alternative tool is mentioned in a short, actionable second sentence.
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 list tool with one optional filtered parameter, strong safety annotations, and no nested objects, the description is complete. It tells the agent what is returned, the scope, and when to switch to the sibling tool, so nothing essential is missing.
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?
Schema description coverage is 100%, and the only parameter, lifecycle, already has a clear enum and description in the schema. The tool description mentions lifecycle as a field but does not add any meaning about the filter parameter beyond what the schema already provides, so the baseline of 3 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 states a specific verb ('Return') and resource ('every portfolio project') and enumerates the returned fields (title, brief description, lifecycle, tech stack). It also explicitly distinguishes this tool from get_project, so an agent can tell them apart without opening schemas.
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?
It clearly identifies get_project as the alternative for accessing full body content and screenshots. This directly routes the agent to the correct sibling based on the desired level of detail, which is exactly the kind of when-to-use guidance needed.
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.
8 tool updates
- First observed
get_activity - First observed
get_experience - First observed
get_post - First observed
get_profile - First observed
get_project - First observed
get_tech_stack - First observed
list_posts - First observed
list_projects
Related MCP Connectors
An interactive portfolio built for AI conversations. Browse work, services, and book calls.
Cameron Rye's blog, projects, resume, and live site stats, plus contact and newsletter tools.
Query Khalid Ibne Hasan's portfolio: profile, availability, case studies, writing, and resume.
Public portfolio MCP for resume, services, availability, project evidence, and introductions.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceExposes a structured professional resume as a set of AI-queryable tools, enabling AI clients like Claude Desktop to query summary, experience, skills, projects, and tailor resumes to job descriptions.1MIT
- FlicenseNot gradedqualityDmaintenanceExposes personal portfolio data as tools for Claude to answer questions about the developer, including profile, skills, experience, projects, and contact information.-
- AlicenseAqualityBmaintenanceExposes a personal portfolio of projects, skills, and resume as callable tools for MCP-compatible AI assistants like Claude Desktop.4MIT
- AlicenseNot gradedqualityCmaintenanceProvides live integrations with GitHub, Spotify, and blog RSS feeds to power a dynamic portfolio.6 npmGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.