
Match a project brief with small vetted software teams, anonymously; sign in to manage your own.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
This tool takes no arguments.
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.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| status | string | |
| tangible | boolean |
{
"type": "object",
"properties": {
"status": {
"enum": [
"open",
"vetting",
"executed"
],
"type": "string"
},
"tangible": {
"type": "boolean"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| brief* | string | The draft brief, markdown or plain text |
| title | string | |
| language | string | ISO 639-1 language the team must speak |
{
"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
}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.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| note | string | |
| appId* | integer | |
| slots* | array | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| slotId* | integer | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| bookingId* | integer |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| title | string | |
| answers | object | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| markdown | string |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| title* | string | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| language | string | |
| markdown* | string |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| text* | string | Anonymous: no names, emails, phone numbers or links. |
| briefId* | integer | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| teamKey* | string |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| text* | string | Anonymous: no names, emails, phone numbers or links. |
| briefId* | integer | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| teamKey* | string |
{
"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
}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.
| Argument | Type | Description |
|---|---|---|
| entity* | string | |
| changes | array | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| teamKey |
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.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| role | string | |
| email* | string | |
| summary* | string | One sentence, in the conversation language, saying what happens on confirm. |
| teamKey* | string |
{
"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
}One booking by its id (bookingId): the proposed slots, its state, and which side the signed-in person is on.
| Argument | Type | Description |
|---|---|---|
| bookingId* | integer |
{
"type": "object",
"required": [
"bookingId"
],
"properties": {
"bookingId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
}
},
"additionalProperties": false
}One public brief in full, markdown body included, by its id (briefId).
| Argument | Type | Description |
|---|---|---|
| briefId* | integer |
{
"type": "object",
"required": [
"briefId"
],
"properties": {
"briefId": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 1
}
},
"additionalProperties": false
}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).
| Argument | Type | Description |
|---|---|---|
| to | string | |
| from | string | |
| limit | integer | |
| identity | string | |
| identities | array |
{
"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
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}The signed-in person's own directory profile: job role, years of experience, languages, rated skills, hourly rate and verification state.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}| string |
| addLangs | array |
| memberKey | string |
| removeLangs | array |
| removeSkills | array |
| removeShipped | array |
| organisationId | string |
{
"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
}