welance/directory
Match a project brief with small vetted software teams, anonymously; sign in to manage your own.
Should I use this
Quality & Safety
Findings (4)
- LOWin directory_capabilities
- LOWin read_profile
- LOWin read_brief
- LOWin read_booking
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"directory": {
"url": "https://welance.com/directory/mcp"
}
}
}Remote endpoints
https://welance.com/directory/mcpstreamable-httpWhat it can do
Tool inventory
Tools (20)
🟢directory_capabilities
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.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢list_open_briefs(status, tangible)
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.
Input Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"vetting",
"executed"
]
},
"tangible": {
"type": "boolean"
}
},
"additionalProperties": false
}🟢preview_teams
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.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢match_brief(brief, title, language)
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.
Input Schema
{
"type": "object",
"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"
}
},
"required": [
"brief"
],
"additionalProperties": false
}🟢brief_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.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢read_profile
The signed-in person's own directory profile: job role, years of experience, languages, rated skills, hourly rate and verification state.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢read_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.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢read_my_pitches
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.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢read_brief(briefId)
One public brief in full, markdown body included, by its id (briefId).
Input Schema
{
"type": "object",
"properties": {
"briefId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
}
},
"required": [
"briefId"
],
"additionalProperties": false
}🟢read_booking(bookingId)
One booking by its id (bookingId): the proposed slots, its state, and which side the signed-in person is on.
Input Schema
{
"type": "object",
"properties": {
"bookingId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
}
},
"required": [
"bookingId"
],
"additionalProperties": false
}🟢read_pitchable_briefs
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.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢read_invoices(identity, identities, from, to, limit)
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).
Input Schema
{
"type": "object",
"properties": {
"identity": {
"type": "string",
"maxLength": 70,
"minLength": 1
},
"identities": {
"type": "array",
"items": {
"type": "string",
"maxLength": 70,
"minLength": 1
},
"maxItems": 10,
"minItems": 1
},
"from": {
"type": "string",
"maxLength": 10
},
"to": {
"type": "string",
"maxLength": 10
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [],
"additionalProperties": false
}🟡propose_brief_draft(title, markdown, answers, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"markdown": {
"type": "string",
"maxLength": 100000,
"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."
}
},
"required": [
"summary"
],
"additionalProperties": false
}🟡propose_brief_publish(title, markdown, language, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"markdown": {
"type": "string",
"maxLength": 100000,
"minLength": 40
},
"language": {
"type": "string",
"maxLength": 17
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"title",
"markdown",
"summary"
],
"additionalProperties": false
}🟡propose_profile_update(entity, teamKey, memberKey, organisationId, 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.
Input Schema
{
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"person",
"member",
"team",
"organisation"
]
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"memberKey": {
"type": "string",
"maxLength": 40,
"minLength": 3
},
"organisationId": {
"type": "string",
"maxLength": 255,
"minLength": 1
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"value": {
"description": "The new value (type depends on field)."
},
"inferred": {
"type": "boolean",
"description": "true when derived from evidence rather than stated by the person or the source"
},
"evidence": {
"type": "string",
"maxLength": 400,
"description": "Minimal supporting excerpt, no contact data."
},
"attachmentId": {
"type": "string",
"maxLength": 120
},
"sourceId": {
"type": "string",
"maxLength": 120,
"description": "The sourceId read_public_url returned, when the value comes from that site."
}
},
"required": [
"field",
"value",
"inferred"
],
"additionalProperties": false
},
"maxItems": 7,
"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
},
"addLangs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 5
},
"maxItems": 8,
"minItems": 1
},
"removeLangs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 5
},
"maxItems": 8,
"minItems": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"entity",
"summary"
],
"additionalProperties": false
}🟡propose_team_invite(teamKey, name, email, role, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"email": {
"type": "string",
"maxLength": 254
},
"role": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"teamKey",
"name",
"email",
"summary"
],
"additionalProperties": false
}⚪propose_pitch_draft(briefId, teamKey, text, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"briefId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"text": {
"type": "string",
"maxLength": 800,
"minLength": 40,
"description": "Anonymous: no names, emails, phone numbers or links."
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"briefId",
"teamKey",
"text",
"summary"
],
"additionalProperties": false
}🟡propose_pitch_send(briefId, teamKey, text, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"briefId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
},
"teamKey": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"text": {
"type": "string",
"maxLength": 800,
"minLength": 40,
"description": "Anonymous: no names, emails, phone numbers or links."
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"briefId",
"teamKey",
"text",
"summary"
],
"additionalProperties": false
}⚪propose_booking(appId, slots, note, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"appId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
},
"slots": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 10,
"minItems": 3
},
"note": {
"type": "string",
"maxLength": 400
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"appId",
"slots",
"summary"
],
"additionalProperties": false
}⚪propose_booking_accept(bookingId, slotId, summary)
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.
Input Schema
{
"type": "object",
"properties": {
"bookingId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
},
"slotId": {
"type": "integer",
"minimum": 1,
"maximum": 1000000000000
},
"summary": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "One sentence, in the conversation language, saying what happens on confirm."
}
},
"required": [
"bookingId",
"slotId",
"summary"
],
"additionalProperties": false
}Community
Evidence