Skip to main content
Glama
htahir1

cdtm-mcp

by htahir1

cdtm-mcp

An MCP server for the CDTM Community Portal, so you can search CDTM students and alumni from Claude Code, Claude Desktop, or any other MCP client.

Instead of clicking through filter dropdowns, you just ask:

"find me CDTM people building AI agents who can help with fundraising"

and Claude figures out the right tags, queries the portal, and gives you names, headlines, and profile links.

Why I built this

Hi, I'm Hamza (Fall 2017, co-founder at ZenML). The community portal is genuinely useful — a few thousand people with skills, interests, and "can support with" tags — but I never remember to open it. I do live in Claude Code all day, so I wired the portal into it as an MCP server. Now finding "alumni in Munich who know venture capital and offer mentoring" is one sentence away, and Claude can cross-reference results with whatever else I'm working on.

If you find this useful, give it a star ⭐ — if enough people do, I'll ask the CDTM team for a proper way to integrate this into the internal app (API tokens instead of the cookie dance below).

Related MCP server: Crosmos MCP Server

Setup

You need Python 3.10+ and uv (or plain pip).

git clone https://github.com/htahir1/cdtm-mcp.git
cd cdtm-mcp

The portal sits behind oauth2-proxy, and there's no public API or token system (yet — see the star pitch above). So the server authenticates with your own browser session cookie:

  1. Log in to internal.cdtm.com in your browser.

  2. Open DevTools (F12) → Network tab → reload the page.

  3. Click any request to internal.cdtm.com → Headers → find the Cookie request header.

  4. Copy the part that starts with _HOST-oauth2-proxy= (it's long).

  5. Create a .env file in the repo root:

CDTM_COOKIE='_HOST-oauth2-proxy=<paste the value here>'

The cookie expires after a while. When the tools start failing with an auth error, repeat the steps. .env is gitignored — keep it that way, this cookie is your login.

Registering with Claude Code

claude mcp add --scope user cdtm -- uv run --directory /path/to/cdtm-mcp python server.py

That's it. Open a new Claude Code session and ask it something.

For Claude Desktop, add the equivalent command to your claude_desktop_config.json.

What it can do

Tool

What it does

search_members

Filter by name, skills, interests, "can support with", "looking for", companies, education, class, location. Paginated.

list_tags

Browse the portal's tag taxonomy (110 skills, 134 interests, ~3000 companies, ...)

get_member_profile

Full profile for one person: bio, tags, contact email

refresh_taxonomy

Re-fetch the tag list if it looks stale

Example prompts that work well:

  • "find CDTM people into agentic AI"

  • "who from the Fall 2017 class is in Berlin?"

  • "alumni who can support with pitch feedback and know climate tech"

  • "pull the full profile for the person I just found"

How it works

Nothing fancy. The portal is a Next.js app whose search runs through its own JSON endpoint (/api/protected/directory?skills=414&interests=62&q=...). This server:

  • pulls the tag taxonomy (names → IDs) out of the /home page payload once per session

  • resolves the human-readable tag names Claude picks into IDs

  • calls the directory endpoint and returns clean JSON

  • parses profile pages server-side for get_member_profile

No scraping of anything you couldn't see in your own browser, no data stored anywhere.

A note on being a good citizen

This reads member-provided data through your own authenticated session. It's for finding people to talk to — not for bulk-exporting the directory or spamming anyone. Don't be that person.

This is an unofficial community project and isn't affiliated with the CDTM team. If they have any concerns about it, or want to talk about a proper API, I'm happy to hear from them.

Available Tools

5 tools
get_member_profileA

Fetch a member's full profile page. profile is a profile URL or the UUID from search results (e.g. '46b84902-3656-41a0-b153-a03ad211436b'). Returns the page's text content (bio, tags, links, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of explaining behavior. It discloses that the tool returns the page's text content (bio, tags, links, etc.), which is useful behavioral information. It does not explicitly state that the operation is read-only or discuss error handling, but 'Fetch' implies a non-destructive read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loads the core purpose, and includes a useful example without excess. Every sentence contributes value, and the structure is clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has a single required parameter and an output schema, the description sufficiently covers the input format, the source of valid inputs, and the nature of the returned content. It is complete for a simple fetch operation, with no significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only specifies the parameter name and type, so the description adds critical meaning by explaining that 'profile' can be a profile URL or a UUID from search results, with a concrete example. This fully compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') and resource ('member's full profile page'), and distinguishes itself by explaining the input can be a profile URL or UUID from search results. This clearly separates it from sibling tools like search_members, which find members rather than fetch a full profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for when to use the tool—after obtaining a profile URL or UUID from search results—and includes an example. However, it does not explicitly mention when not to use it or name alternative tools, so it stops short of fully explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tag_categoriesA

List the filter categories available on the CDTM portal and how many options each has. Use list_tags(category) to see the options.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description is the sole source of behavioral information. It states the tool 'lists' categories and mentions the output includes 'how many options each has,' which implies a read-only operation. However, it does not explicitly mention whether output is sorted, paginated, or otherwise constrained. For a simple listing tool, this is acceptable but not deeply transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two complete sentences with clear front-loading: the first sentence states the core function, the second provides a pointer to a related tool. No wasted words; every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (zero parameters) and the presence of an output schema (per context signals), the description is sufficiently complete. It explains what the tool returns (categories with option counts) and how to drill down further using list_tags. Sibling context further clarifies where this tool fits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema has no properties with 100% coverage. The description therefore does not need to explain parameter meaning. The baseline for zero-parameter tools is 4, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's function: 'List the filter categories available on the CDTM portal and how many options each has.' This uses a specific verb and resource, and it distinguishes itself from the sibling tool list_tags by explaining that list_tags is used for seeing options within a category.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a direct cross-reference: 'Use list_tags(category) to see the options.' This implies the intended workflow and alternatives, though it does not explicitly state when not to use this tool. Still, the usage context is clear for a simple list-all tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA

List available tag names for a filter category, optionally filtered by a case-insensitive substring.

Categories: skills, interests, supports ("Can Support With"), searching ("Looking For"), companies, education, cohorts (class, e.g. "Fall 2017"), locations.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYes
containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description is the only source of behavioral information. It discloses the case-insensitive filtering behavior and the optional default, adding some value beyond the schema. It does not cover potential error conditions or response characteristics, but for a simple list operation this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a category list, with the main purpose front-loaded in the first sentence. Every sentence adds value; there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity, two parameters, and an existing output schema, the description covers purpose, parameters, and behavioral nuances. It could be improved by explicitly linking to list_tag_categories for authoritative category values, but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully compensates: it explains the 'category' parameter with enumerated examples and the 'contains' parameter as a case-insensitive substring, including its optionality. This gives an agent complete parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific action ('List available tag names') on a defined resource ('filter category'), with an optional filter. This clearly distinguishes it from sibling tools like list_tag_categories, which handle categories rather than tag names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use the tool by enumerating valid categories and noting the optional substring filter. However, it does not explicitly mention alternatives or when not to use it, such as cross-referencing list_tag_categories for available categories.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_taxonomyA

Re-fetch the filter taxonomy from the portal (use if tags seem stale).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It merely says 're-fetch' without disclosing side effects (e.g., whether it mutates local state, makes external network calls, or blocks). This is minimal behavioral disclosure for a tool that likely has an update-like side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence communicates purpose and usage guidance with no filler. Every word contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description is sufficient: it states what the tool does and when to use it. It does not need to explain return values due to the output schema, though it could mention any blocking or performance implications.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, so per the rubric the baseline is 4. The description correctly implies there are no configurable inputs and focuses on the action itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's verb ('re-fetch'), resource ('filter taxonomy'), and source ('from the portal'). It distinguishes itself from sibling tools (list_tag_categories, list_tags) which are read/list operations, whereas this is a refresh operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage trigger: 'use if tags seem stale.' This provides context on when to invoke this tool, though it does not explicitly contrast with alternatives or mention when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_membersA

Search CDTM community members (students + alumni).

All tag arguments take human-readable names (e.g. skills=["Machine Learning", "Agentic AI"]) which are resolved against the portal's taxonomy — use list_tags() first if unsure of exact naming. Combining filters narrows the search. Returns member cards (id, name, headline, location, cohort, tags, profile_url) plus totalCount/totalPages; pass page=2 etc. to paginate.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
pageNo
skillsNo
cohortsNo
companiesNo
educationNo
interestsNo
locationsNo
looking_forNo
can_support_withNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden. It discloses that tag arguments are resolved against the portal's taxonomy, returns member cards with specific fields plus totalCount/totalPages, and explains pagination via page parameters. It doesn't cover auth, rate limits, or sorting, but provides strong behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (about 90 words) and front-loaded with the primary purpose. Each sentence adds value: scope, taxonomy resolution guidance, and return/pagination details. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with 10 parameters, the description covers the essential aspects: what it searches, how tag filters work, how to get valid tag names, what the response contains, and pagination. It omits sorting and result limits, but overall it's sufficiently complete for an agent to use the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that all tag arguments take human-readable names resolved against taxonomy, gives an example using skills, states combining filters narrows results, and mentions page pagination. This covers the key parameter semantics effectively, though it doesn't enumerate each filter individually.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches CDTM community members (students + alumni), using a specific verb and resource. It distinguishes itself from sibling tools like list_tags and get_member_profile by focusing on member search and result cards.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance to use list_tags() first when unsure of exact tag names, and notes that combining filters narrows the search. It doesn't explicitly contrast with get_member_profile for single-member lookups, but the context makes the search-versus-profile distinction clear.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_member_profile
    • First observedlist_tag_categories
    • First observedlist_tags
    • First observedrefresh_taxonomy
    • First observedsearch_members

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clear, distinct purpose: listing categories, listing tags, searching members, fetching profiles, and refreshing taxonomy. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: list_tag_categories, list_tags, search_members, get_member_profile, refresh_taxonomy. The style is uniform and predictable.

Tool Count5/5

Five tools is well-scoped for a community directory. Each tool serves a necessary function without redundancy or bloat.

Completeness5/5

The set covers browsing taxonomy, searching members, and fetching detailed profiles. The read-only nature of the domain is fully supported, with no obvious gaps.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/htahir1/cdtm-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server