Brahim Bousnguar — portfolio
Server Details
Brahim Bousnguar's portfolio: profile, availability, case studies, notes, CV requests.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: profile, availability, listing content, fetching a specific item, keyword search, and CV request. There is no meaningful overlap between browsing (list_items), searching (search), and retrieving full text (get_item).
Five of six tools follow a predictable verb_noun or verb pattern (get_availability, get_item, get_profile, list_items, request_cv). The bare 'search' is a minor deviation but remains immediately understandable.
Six tools are well-scoped for a personal portfolio and CV-serving server. Each tool earns its place, with no redundant or trivial entries.
The surface covers profile, availability, content listing/retrieval, search, and CV requests, which is nearly full lifecycle for the domain. There is a small gap around explicitly retrieving French-language items, though the description hints they exist and can be fetched.
Available Tools
6 toolsget_availabilityAvailabilityARead-onlyIdempotentInspect
Whether Brahim is open to new roles right now, what kind, from when, and where (dated).
| 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, destructiveHint=false and openWorldHint=false, so the safety and side-effect profile is fully covered. The description adds only that the answer is a dated, person-specific snapshot; it says nothing about freshness, staleness, or response shape.
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 with no filler; the qualifying facets are packed in without redundant restatement of the name or title.
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 only the burden of describing what comes back, and it does that by enumerating the distinct facets. It stops short of noting whether data is dated/historical versus live, which is a minor omission for a read-only lookup.
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; the baseline for parameter-free tools 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 specific resource — Brahim's current openness to new roles — and lists the returned facets (kind, start date, location), so an agent can tell what it yields. It does not explicitly contrast with get_profile, a likely overlapping sibling, which keeps it from a 5.
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 when-to-use guidance, no prerequisite, and no routing to alternatives such as get_profile or request_cv. The agent must infer the usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_itemRead a case study, project or noteARead-onlyIdempotentInspect
Full text (Markdown) of one case study, project or note by its slug, as listed by list_items. Case studies and projects also exist in French.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| lang | No | en | |
| slug | Yes | e.g. api-led-luxury-retail, mulewatch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds value on top: the return payload is the full Markdown body (not a summary), and there is a locale dimension for work/projects only. It does not discuss missing-item behavior, but with annotations carrying the safety profile this is genuinely additive.
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 that front-loads the return format and resource, then appends the i18n caveat. No filler and nothing redundant.
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, and the description correctly fills that gap by naming the response format and content type. All three parameters are accounted for. The only gap is failure behavior for an unknown slug, which is minor for a read 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?
Schema coverage is only 33% (only slug is described), but kind and lang are enums and largely self-documenting. The description adds real semantics beyond the schema: 'Case studies and projects also exist in French' implies that lang=fr applies to work/projects but not to notes, a constraint the enum alone does not convey.
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 ('Full text (Markdown) of one case study, project or note') and scopes it to a single item by slug. It explicitly names the sibling list_items as the source of slugs, so an agent can distinguish retrieval from listing without opening either schema.
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 'as listed by list_items' tells the agent the prerequisite and the correct alternative for discovery, which is strong routing guidance. It stops short of explicit when-not conditions (e.g. what to do if the slug is unknown) but the intended flow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileProfileARead-onlyIdempotentInspect
Brahim's headline, summary, location, languages, certifications (with verification links), skills and links. Start here.
| 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 covered without description help. The description adds one genuinely useful output detail (certifications include verification links) but says nothing about authorization requirements or how the profile is scoped to a single person.
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?
Very short and front-loaded with the returned field list, with the routing hint ("Start here") placed at the end. It is written as two sentence fragments rather than prose, which is efficient but slightly telegraphic.
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 describing return values and does so reasonably well by listing the main fields. It omits any mention of whose profile is returned when the caller has multiple contexts, and no auth/scope notes, leaving a small gap.
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 for the description to disambiguate; baseline is 4. The description correctly implies the call takes no filtering input and returns a fixed profile.
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 the resource contents (headline, summary, location, languages, certifications, skills, links), so an agent knows this retrieves a personal profile rather than a generic item. It lacks an explicit verb and does no explicit sibling differentiation (get_item/list_items could plausibly return similar field sets), which keeps it from a 5.
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?
"Start here" gives a mild implied entry-point ordering, suggesting this is the first call in a session. However, no alternative tool is named and no condition for preferring this over get_item or search is stated, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_itemsList case studies, projects or notesARead-onlyIdempotentInspect
List the anonymised client case studies (work), side projects (projects) or technical notes (notes), newest first, with a one-line summary and URL.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | work, projects or notes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive, closed-world profile, so the bar is lower. The description still adds useful traits: results are ordered newest first, entries are anonymised, and each carries a one-line summary and URL. It does not state any count cap or truncation 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?
One sentence, front-loaded with the verb and resource set, with the return shape and ordering packed into trailing clauses. No filler.
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 usefully sketches the return shape (summary + URL) and ordering. It omits any note on result limits, pagination, or expected volume, which is a minor gap for a simple enum-filtered listing 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?
Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches the single enum parameter by explaining what each value selects rather than restating 'work, projects or notes'. That added meaning beats the schema's bare enum list.
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?
Names a specific verb (List) and enumerates the three resources it returns, mapping each enum value to its plain-language meaning (work = anonymised client case studies, projects = side projects, notes = technical notes). It implicitly contrasts with the singular get_item sibling, though it never names an alternative outright.
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 enum values themselves: call this to enumerate everything of one content type. There is no explicit statement of when to prefer this over search or get_item, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_cvAsk for Brahim's CVAInspect
File a request for Brahim's full CV, exactly like the form on heybrahim.com/cv.html. Brahim reads every request and sends the CV himself by email, usually the same day; nothing is sent automatically. Only call this when the user explicitly asked for the CV and gave their own name and email. Limited to a few requests per day.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | en | |
| name | Yes | The requester's own name | |
| role | No | The role or mission, if any | |
| Yes | Where Brahim should send the CV | ||
| company | No | ||
| message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is non-read-only, open-world and non-idempotent; the description adds the crucial behavioral facts an agent cannot infer: nothing is sent automatically, a human (Brahim) reads and replies by email usually same-day, and the tool is rate-limited to a few requests per day.
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?
Four compact sentences, front-loaded with the action, then the human/async consequence, then the gating condition. Every clause carries information an agent would otherwise have to guess.
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 mutation tool with no output schema, the description covers the trigger, the post-call behavior, and rate limits well. The only gap is the undocumented optional fields (lang, company, message), which is a minor omission given they are optional.
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?
With 50% schema coverage, four of six parameters (lang, company, message, role) lack descriptions in either place. The description does add one piece of real meaning beyond the schema — that name and email must be the requester's own, not a third party's — but it does not compensate for the undocumented remaining fields.
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 and resource ('File a request for Brahim's full CV') and grounds it in a concrete referent (the form at heybrahim.com/cv.html). It is immediately distinguishable from the CRUD-like siblings (get_item, list_items, search), which handle different resources entirely.
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?
Gives an explicit trigger and prerequisite: 'Only call this when the user explicitly asked for the CV and gave their own name and email.' No alternatives are named, but the sibling tools are not substitutes for this action, so the routing guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch the portfolioARead-onlyIdempotentInspect
Keyword search across every case study, project and note (e.g. "DataWeave", "CCv2 migration", "MCP"). Returns titles, URLs and a snippet; use get_item for the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavioral context: it discloses the return shape (titles, URLs, snippet). It omits ranking/zero-result behavior, but that's minor against the annotation coverage.
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, front-loaded with scope and the return contract, followed by the escape hatch to get_item. Examples are inline and cheap; nothing is wasted.
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 correctly spells out what comes back and points to get_item for full text, which is exactly what an agent needs to chain calls. Missing only edge-case detail such as empty-result handling or result ordering.
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 0%, so the description must carry the load: it defines the query as keyword-based and gives three concrete examples, which is real added meaning. However the `limit` parameter is never mentioned in prose, leaving half the parameters unexplained (its default/min/max are only machine-readable).
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: 'Keyword search across every case study, project and note', with concrete query examples. It also distinguishes itself from the sibling get_item, so an agent can route correctly without opening a schema.
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?
'use get_item for the full text' names the alternative and the condition that selects it, which is the key routing decision for a search tool. It doesn't cover the browse path (list_items) or say when searching is inappropriate.
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
- First observed
get_availability - First observed
get_item - First observed
get_profile - First observed
list_items - First observed
request_cv - First observed
search
Related MCP Connectors
Query Khalid Ibne Hasan's portfolio: profile, availability, case studies, writing, and resume.
An interactive portfolio built for AI conversations. Browse work, services, and book calls.
Read-only access to Sigao Li's profile, CV and case studies. Bilingual (EN/ZH).
Public portfolio MCP for resume, services, availability, project evidence, and introductions.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables querying a personal portfolio through natural language, providing profile, skills, projects, services, availability, and contact information via read-only tools.7267 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants and LLM clients to query a professional CV and portfolio, including work history, technical skills, projects, job compatibility evaluation, education, and contact details.MIT
- FlicenseNot gradedqualityDmaintenanceExposes personal portfolio data as tools for Claude to answer questions about the developer, including profile, skills, experience, projects, and contact information.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to discover and retrieve professional portfolio information including profile, experience, skills, projects, and contact details through MCP tools.-
Glama MCP Gateway
Add one secure layer between your agents and this server.