welance/directory MCP
An MCP server operated by welance that allows AI agents to read public directory data (briefs, teams, rules) and, with user OAuth authentication, read the user's private directory profile and propose changes. It facilitates matching project briefs with vetted software teams by enabling agents to prepare briefs and proposals, while final actions like publishing, inviting, and paying remain manual user clicks on the website.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://welance.com/directory/mcpWhat you can do with it
- Read public briefs, teams, and scoring rules
- Read user's private profile, briefs, and bookings
- Propose brief improvements or team matches for user confirmation
Source and maintenance
Protocol and capabilities
- Server
- welance-directory 1.1.0
- MCP protocol
- 2025-06-18
- Tools
- 20 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
20 advertised
directory_capabilities — What welance/directory is
What the directory is, who it is for (small vetted software teams for digital projects, especially ones rooted in the physical world), how pricing works (0% of the project; €30 + VAT from each side only to meet, charged once both accept a time), and the rule that the human stays the principal.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"title": "What welance/directory is",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_open_briefs — Open briefs and delivered projects
The public briefs: open ones looking for a team, ones in vetting, and the archive of delivered projects with budget, sector and delivery team. Anonymised server-side. Filter by status or to tangible-world projects only.
{
"type": "object",
"properties": {
"status": {
"enum": [
"open",
"vetting",
"executed"
],
"type": "string"
},
"tangible": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Open briefs and delivered projects",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}preview_teams — A protected preview of the team board
Two anonymous, vetted teams as specimens (rotating daily) and the size of the supply — never the whole board. The board is brief-first: the teams that fit a project are listed only against a draft brief. Names and members are revealed only after a mutual €30-per-side handshake.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"title": "A protected preview of the team board",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}match_brief — Shortlist teams for a draft brief
Match a draft brief (80–20000 characters) against the real, eligible anonymous teams: only teams the brief matches come back, with reasons and the defaults inferred from the brief. Same derivation and matcher as publishing, stores nothing, calls no LLM. Ends with a "Start this brief" link that opens the guided flow prefilled.
{
"type": "object",
"required": [
"brief"
],
"properties": {
"brief": {
"type": "string",
"description": "The draft brief, markdown or plain text"
},
"title": {
"type": "string"
},
"language": {
"type": "string",
"description": "ISO 639-1 language the team must speak"
}
},
"additionalProperties": false
}{
"title": "Shortlist teams for a draft brief",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}brief_rules — The public scoring rules
The rule catalogue a brief is scored against before teams see it: ids, labels, weights and the acceptance threshold that decides whether a brief publishes.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"title": "The public scoring rules",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_profile — My profile
The signed-in person's own directory profile: job role, years of experience, languages, rated skills, hourly rate and verification state.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}{
"title": "My profile",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_my_teams — My teams
The signed-in person's teams: key (teamKey), name, and the facts the system derives rather than stores (members = confirmed people; rate = blended from members' rates unless the team sets an override; languages from members unless set); each team's profile (based, remote, availability, shipped work), open and matching brief counts, and a checklist of what pitching and the public board require, each marked met or missing.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}{
"title": "My teams",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_my_pitches — My briefs, pitches and bookings
The signed-in person's pitches and bookings on both sides: applications sent by their teams (with handshake and booking state) and the anonymous pitches received on their own briefs.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}{
"title": "My briefs, pitches and bookings",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_brief — One brief
One public brief in full, markdown body included, by its id (briefId).
{
"type": "object",
"required": [
"briefId"
],
"properties": {
"briefId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
}
},
"additionalProperties": false
}{
"title": "One brief",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_booking — One booking
One booking by its id (bookingId): the proposed slots, its state, and which side the signed-in person is on.
{
"type": "object",
"required": [
"bookingId"
],
"properties": {
"bookingId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
}
},
"additionalProperties": false
}{
"title": "One booking",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_pitchable_briefs — Briefs my teams can pitch on
For each of the signed-in person's teams, the open briefs that team can still pitch on: not yet pitched, pitch slots left, and a language match.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}{
"title": "Briefs my teams can pitch on",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_invoices — My invoices
The signed-in person's past invoices with their PDF and document links (pdfUrl / documentUrl). Without filters it covers every billing identity of the person (personal VAT plus companies they own or administer); each invoice is tagged with its identity {kind, id, label, vatMasked}. identity ("all", "personal" or "org:<organisationId>") or identities (several of "personal" / "org:<organisationId>") narrow by identity; from/to (YYYY-MM-DD, inclusive) narrow by date; limit caps the count (1–50).
{
"type": "object",
"required": [],
"properties": {
"to": {
"type": "string",
"maxLength": 10
},
"from": {
"type": "string",
"maxLength": 10
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"identity": {
"type": "string",
"maxLength": 70,
"minLength": 1
},
"identities": {
"type": "array",
"items": {
"type": "string",
"maxLength": 70,
"minLength": 1
},
"maxItems": 10,
"minItems": 1
}
},
"additionalProperties": false
}{
"title": "My invoices",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}propose_brief_draft — Propose a brief draft
A proposed update to the person's local brief draft: title, markdown, and/or per-rule answers. Accepting it fills the brief editor; nothing is published. The whole proposal is limited to 64,000 UTF-8 bytes. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"summary"
],
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"answers": {
"type": "object",
"additionalProperties": {
"type": "string",
"maxLength": 4000
}
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"markdown": {
"type": "string",
"maxLength": 100000,
"minLength": 1
}
},
"additionalProperties": false
}{
"title": "Propose a brief draft",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_brief_publish — Propose publishing a brief
A proposal to publish a brief (title, markdown, optional language) to the board. On confirmation the server's live score gate decides whether it publishes; publishing emails a one-time link and signs no one in. The whole proposal is limited to 64,000 UTF-8 bytes. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"title",
"markdown",
"summary"
],
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"language": {
"type": "string",
"maxLength": 17
},
"markdown": {
"type": "string",
"maxLength": 100000,
"minLength": 40
}
},
"additionalProperties": false
}{
"title": "Propose publishing a brief",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_profile_update — Propose profile changes
Proposed field changes to one entity. entity "person": the signed-in person's own profile (job_role, years_experience, langs, skills, hourly_rate). entity "member" + teamKey + memberKey: a confirmed colleague on one of the person's teams (job_role, years_experience, langs, hourly_rate; skills are rated only by their owner). entity "team" + teamKey: intro, based, remote, availability, langs, shipped, hourly. entity "organisation" + organisationId: website, description of an organisation the person owns or administers (descriptive only; it verifies nothing). Skills: changes[{field:"skills", value:[{name, rating 1–10}]}] adds or re-rates (an existing name takes the new rating); removeSkills lists skill names to remove. Languages: addLangs / removeLangs take two-letter codes; alternatively a langs change carries the complete new list (not both). Scalars: changes[{field, value}]; hourly_rate is EUR/h, 10–2000; team hourly overrides the rate blended from members' rates, and null restores the blend; team size is not a field (it is the confirmed member count). Team shipped: value lists entries to add, each {title, url, desc}; existing entries are kept; removeShipped lists titles or links to remove. inferred=true marks a value derived from evidence rather than stated by the person; hourly rate, availability, languages and skill ratings are rejected when inferred. Each changed field becomes a separate card the person approves. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"entity",
"summary"
],
"properties": {
"entity": {
"enum": [
"person",
"member",
"team",
"organisation"
],
"type": "string"
},
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"value",
"inferred"
],
"properties": {
"field": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"value": {
"description": "The new value (type depends on field)."
},
"evidence": {
"type": "string",
"maxLength": 400,
"description": "Minimal supporting excerpt, no contact data."
},
"inferred": {
"type": "boolean",
"description": "true when derived from evidence rather than stated by the person or the source"
},
"sourceId": {
"type": "string",
"maxLength": 120,
"description": "The sourceId read_public_url returned, when the value comes from that site."
},
"attachmentId": {
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
},
"maxItems": 7,
"minItems": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"addLangs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 5
},
"maxItems": 8,
"minItems": 1
},
"memberKey": {
"type": "string",
"maxLength": 40,
"minLength": 3
},
"removeLangs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 5
},
"maxItems": 8,
"minItems": 1
},
"removeSkills": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"maxItems": 30,
"minItems": 1
},
"removeShipped": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"maxItems": 12,
"minItems": 1
},
"organisationId": {
"type": "string",
"maxLength": 255,
"minLength": 1
}
},
"additionalProperties": false
}{
"title": "Propose profile changes",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_team_invite — Propose inviting someone to a team
A proposal to invite a person to one of the signed-in person's teams (teamKey) by name and email, with an optional role. Once confirmed, the invitee receives an email; their skill ratings are theirs to set later. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"teamKey",
"name",
"email",
"summary"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"role": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"email": {
"type": "string",
"maxLength": 254
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
}
},
"additionalProperties": false
}{
"title": "Propose inviting someone to a team",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_pitch_draft — Propose a pitch draft
An anonymous pitch draft for one of the person's teams (teamKey) on an open brief (briefId). Accepting it fills the existing pitch editor; nothing is sent. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"briefId",
"teamKey",
"text",
"summary"
],
"properties": {
"text": {
"type": "string",
"maxLength": 800,
"minLength": 40,
"description": "Anonymous: no names, emails, phone numbers or links."
},
"briefId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
}
},
"additionalProperties": false
}{
"title": "Propose a pitch draft",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_pitch_send — Propose sending a pitch
A proposal to send an anonymous pitch for one of the person's teams (teamKey) on an open brief (briefId); once confirmed, the brief owner sees it. Each brief accepts a limited number of pitches (10). Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"briefId",
"teamKey",
"text",
"summary"
],
"properties": {
"text": {
"type": "string",
"maxLength": 800,
"minLength": 40,
"description": "Anonymous: no names, emails, phone numbers or links."
},
"briefId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
}
},
"additionalProperties": false
}{
"title": "Propose sending a pitch",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_booking — Propose meeting times
As the client of a pitch on the person's own brief (appId): a proposed 30-minute call with at least 3 concrete slots (ISO 8601; weekdays, on the hour, 09–18 CET, 3–10 business days ahead) and an optional note. Confirming holds €30 from the client's side for up to 7 days; nothing is charged until both sides accept a time. A no-show's €30 is not returned; the side that showed gets a credit. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"appId",
"slots",
"summary"
],
"properties": {
"note": {
"type": "string",
"maxLength": 400
},
"appId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
},
"slots": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 10,
"minItems": 3
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"additionalProperties": false
}{
"title": "Propose meeting times",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}propose_booking_accept — Propose accepting a meeting time
As the team on a booking (bookingId): a proposal to accept one of the client's offered slots (slotId). Accepting charges €30 from each side; if the client does not show, the team's €30 becomes a credit; if the team does not show, its €30 is not returned. Stores a proposal only. Nothing happens until the person confirms it on welance.com/directory; the result includes the review link.
{
"type": "object",
"required": [
"bookingId",
"slotId",
"summary"
],
"properties": {
"slotId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
},
"bookingId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
}
},
"additionalProperties": false
}{
"title": "Propose accepting a meeting time",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1541 ms
- 95th percentile latency
- 1541 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1541 ms · metadata changed · 20 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http welance-directory-mcp https://welance.com/directory/mcpCodex
codex mcp add welance-directory-mcp --url https://welance.com/directory/mcpCursor
{
"mcpServers": {
"welance-directory-mcp": {
"url": "https://welance.com/directory/mcp"
}
}
}Cline
{
"mcpServers": {
"welance-directory-mcp": {
"type": "streamableHttp",
"url": "https://welance.com/directory/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"welance-directory-mcp": {
"type": "http",
"url": "https://welance.com/directory/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http welance-directory-mcp https://welance.com/directory/mcpClaude Desktop
{
"mcpServers": {
"welance-directory-mcp": {
"url": "https://welance.com/directory/mcp"
}
}
}Windsurf
{
"mcpServers": {
"welance-directory-mcp": {
"serverUrl": "https://welance.com/directory/mcp"
}
}
}Let your agent find its tools
Find servers like welance/directory MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other project management servers
Do you run welance/directory MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.