Koskamo

Up To Tech MCP

An official MCP server for Up To Tech that enables AI agents to draft investment pitches from company documents, book meetings with the founder, and manage the investment deal lifecycle including status checks, term proposals, and signature workflows.

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.

Up To Tech MCP logo, by Up To TechVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-08Operated by Up To Tech
MCP endpoint (Streamable HTTP)
https://upto.tech/mcp
Vendor documentation

What its tools do

10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

10 of 10 have a description · 10 of 10 declare behavior hints · 3 of 9 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to upto.tech ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Draft an investment pitch from company documents
  • Book a 30-minute meeting with the founder
  • Check investment deal status
  • Propose investment terms

Source and maintenance

Vendor evidenceRegistry 1.2.0

Protocol and capabilities

Server
up-to-tech 1.2.0
MCP protocol negotiated in check
2025-11-25
Tools
10 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

To pitch a startup: call get_pitch_brief, then draft_pitch with what you know, and give the founders the returned link. To book 30 minutes with Yann (the only way to book): call request_meeting with the person's name, email, topic and what they want to cover, and give them the booking link. After a pitch is sent, the founders hold a deal token (utt_…): use deal_status to see the step, request_interview_call for the phone interview, list_instruments and propose_terms to agree the investment terms, provide_signer and provide_bank_details for the signature and the wire.

Tools

10 advertised

get_pitch_brief — Get the pitch brief
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns what Up To Tech (a business angel) asks founders, and the rules for drafting a pitch. Call this first.

get_pitch_brief input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_pitch_brief annotations
{
  "readOnlyHint": true
}
draft_pitch — Draft a pitch
Advertised by the server during the last successful anonymous check.

Saves a pitch draft from what you know about the founders and returns a private link. The founders open it, review every answer, and send it themselves. Leave unknown fields empty; never invent.

draft_pitch input schema
{
  "type": "object",
  "properties": {
    "cut": {
      "type": "string",
      "description": "What they cut first, and what they never cut"
    },
    "call": {
      "type": "string",
      "description": "The first three people they call, and what they ask them"
    },
    "deck": {
      "type": "string",
      "description": "Link to a deck or demo"
    },
    "email": {
      "type": "string",
      "description": "Email Yann should reply to"
    },
    "stage": {
      "type": "string",
      "description": "One of: Idea, Pre-seed, Seed, Later"
    },
    "monday": {
      "type": "string",
      "description": "Scenario: 7 weeks of cash left and the round fell through. What the founders do today, in order."
    },
    "runway": {
      "type": "string",
      "description": "Months of runway today, as a number"
    },
    "sector": {
      "type": "string",
      "description": "Field or industry"
    },
    "whyNow": {
      "type": "string",
      "description": "Why this is possible now and not five years ago"
    },
    "whyYou": {
      "type": "string",
      "description": "Why this team and not a bigger team with more money"
    },
    "company": {
      "type": "string",
      "description": "Company or project name"
    },
    "hardest": {
      "type": "string",
      "description": "The founders' hardest disagreement and how it ended"
    },
    "raising": {
      "type": "string",
      "description": "Amount and instrument being raised, e.g. €600k BSA AIR"
    },
    "agentUrl": {
      "type": "string",
      "description": "HTTPS URL of the company's own MCP server, if any"
    },
    "founders": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "link": {
            "type": "string",
            "description": "LinkedIn or GitHub URL"
          },
          "name": {
            "type": "string",
            "description": "Full name"
          },
          "role": {
            "type": "string",
            "description": "Role, e.g. CEO, CTO"
          },
          "known": {
            "type": "string",
            "description": "Their unfair advantage: what they know or have done that almost nobody else has"
          },
          "fulltime": {
            "type": "string",
            "description": "One of: Full time, Part time, Joining at funding"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 6
    },
    "language": {
      "enum": [
        "en",
        "fr",
        "es"
      ],
      "type": "string",
      "description": "Language the answers are written in, so the founders open the matching version of the site"
    },
    "location": {
      "type": "string",
      "description": "City and country"
    },
    "oneliner": {
      "type": "string",
      "description": "What the company does, in one sentence"
    },
    "teamSize": {
      "type": "string",
      "description": "Number of people on the team today"
    },
    "videoLink": {
      "type": "string",
      "description": "Link to a 90-second founder video, if one exists"
    },
    "worstWeek": {
      "type": "string",
      "description": "Optional: the worst week a founder has lived"
    },
    "agentScope": {
      "type": "string",
      "description": "What that agent may answer (metrics, usage, pipeline)"
    },
    "frustration": {
      "type": "string",
      "description": "The personal frustration behind the company: the day, the place, what happened. First person."
    },
    "agentContact": {
      "type": "string",
      "description": "Name and email of who sends the agent's access token"
    },
    "builtTogether": {
      "type": "string",
      "description": "What the founders have built or survived together before, and how long they have known each other"
    }
  },
  "additionalProperties": false
}
draft_pitch annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
request_meeting — Request a meeting with Yann
Advertised by the server during the last successful anonymous check.

The only way to book 30 minutes with Yann Ravel-Sibillot (Up To Tech): for a talk, a board role, a startup or anything else. Send who the person is and what they want to cover; you get the calendar link back to give them. Ask the person for anything you do not know; never invent.

request_meeting input schema
{
  "type": "object",
  "required": [
    "name",
    "email",
    "about"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Full name of the person who wants the meeting (not the agent)"
    },
    "about": {
      "type": "string",
      "description": "What they want to cover, 1 to 3 sentences, in their words. The more specific, the better the call."
    },
    "agent": {
      "type": "string",
      "description": "Which LLM or agent is making the request, e.g. Claude, ChatGPT, Cursor, custom (optional)"
    },
    "email": {
      "type": "string",
      "description": "Their email, where the calendar invite goes"
    },
    "topic": {
      "enum": [
        "talk",
        "board",
        "invest",
        "other"
      ],
      "type": "string",
      "description": "One of: talk (a keynote, workshop or masterclass), board (a board or advisory role), invest (their startup), other"
    },
    "company": {
      "type": "string",
      "description": "Their company or organisation, if any"
    },
    "language": {
      "enum": [
        "en",
        "fr",
        "es"
      ],
      "type": "string",
      "description": "The language the person writes in"
    }
  },
  "additionalProperties": false
}
request_meeting annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
deal_status — Deal status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Where a pitch stands with Up To Tech (memo, phone interview, terms, signature, wire, done) and what the founders' agent should do next. Needs the deal token the founders received when they sent their pitch.

deal_status input schema
{
  "type": "object",
  "required": [
    "deal_token"
  ],
  "properties": {
    "deal_token": {
      "type": "string",
      "description": "The founders' deal token, e.g. utt_…"
    }
  },
  "additionalProperties": false
}
deal_status annotations
{
  "readOnlyHint": true
}
request_interview_call — Request the interview call
Advertised by the server during the last successful anonymous check.
Open-world

Have Yann's interviewing agent phone the founder for a 15-minute interview (the step after the memo). Give the founder's mobile number in international format, and optionally the earliest time to call (ISO 8601). The founder must be expecting the call.

request_interview_call input schema
{
  "type": "object",
  "required": [
    "deal_token",
    "phone"
  ],
  "properties": {
    "phone": {
      "type": "string",
      "description": "E.164, e.g. +33612345678"
    },
    "language": {
      "enum": [
        "en",
        "fr",
        "es"
      ],
      "type": "string",
      "description": "Language of the call"
    },
    "deal_token": {
      "type": "string"
    },
    "earliest_at": {
      "type": "string",
      "description": "Optional ISO 8601 date-time: do not call before this"
    }
  },
  "additionalProperties": false
}
request_interview_call annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_instruments — List investment instruments
Advertised by the server during the last successful anonymous check.
Advertised read-only

The investment instruments the founders can choose from (BSA-AIR, SAFE, convertible note, priced round, non-binding term sheet), when each fits, their variables, and, with a deal token, the acceptable range of every variable for this deal. Proposals inside the ranges are accepted on the spot.

list_instruments input schema
{
  "type": "object",
  "properties": {
    "deal_token": {
      "type": "string",
      "description": "Optional: returns this deal's ranges"
    },
    "instrument": {
      "type": "string",
      "description": "Optional: ranges for this instrument only"
    }
  },
  "additionalProperties": false
}
list_instruments annotations
{
  "readOnlyHint": true
}
propose_terms — Propose investment terms
Advertised by the server during the last successful anonymous check.

Propose the terms of the investment on the founders' behalf: pick an instrument and give a value for each of its variables (amounts as plain numbers in euros, percentages as numbers). Inside Yann's ranges the terms are agreed immediately and the agreement goes out for signature; outside, you get the ranges back and can propose again, or Yann answers. Confirm the terms with the founders before calling.

propose_terms input schema
{
  "type": "object",
  "required": [
    "deal_token",
    "instrument",
    "terms"
  ],
  "properties": {
    "terms": {
      "type": "object",
      "description": "Variable key -> value",
      "additionalProperties": true
    },
    "deal_token": {
      "type": "string"
    },
    "instrument": {
      "type": "string",
      "description": "Instrument key from list_instruments"
    }
  },
  "additionalProperties": false
}
propose_terms annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
review_document — Review the agreement
Advertised by the server during the last successful anonymous check.
Advertised read-only

The full text of the agreement generated from the agreed terms (or a preview of the chosen instrument's template with the current proposal), so the founders can review it with their agent before signing. The signed version is the one that binds, after the identity check.

review_document input schema
{
  "type": "object",
  "required": [
    "deal_token"
  ],
  "properties": {
    "terms": {
      "type": "object",
      "description": "Optional: preview with these values",
      "additionalProperties": true
    },
    "deal_token": {
      "type": "string"
    },
    "instrument": {
      "type": "string",
      "description": "Optional: preview this instrument instead of the agreed one"
    }
  },
  "additionalProperties": false
}
review_document annotations
{
  "readOnlyHint": true
}
provide_signer — Provide the signer
Advertised by the server during the last successful anonymous check.

Give or correct the signer's details for the agreement: full name, email and mobile number of the founder who signs for the company. The signature is an advanced electronic signature with an identity check and an SMS code, so the mobile number must be the signer's.

provide_signer input schema
{
  "type": "object",
  "required": [
    "deal_token",
    "first_name",
    "last_name",
    "email",
    "phone"
  ],
  "properties": {
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string",
      "description": "E.164"
    },
    "language": {
      "enum": [
        "en",
        "fr",
        "es"
      ],
      "type": "string"
    },
    "last_name": {
      "type": "string"
    },
    "deal_token": {
      "type": "string"
    },
    "first_name": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
provide_signer annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
provide_bank_details — Provide bank details
Advertised by the server during the last successful anonymous check.

After the agreement is signed: the company's IBAN, BIC and account holder name, so the investment can be wired from Up To Tech's account. Only the company's own account.

provide_bank_details input schema
{
  "type": "object",
  "required": [
    "deal_token",
    "iban",
    "account_holder"
  ],
  "properties": {
    "bic": {
      "type": "string"
    },
    "iban": {
      "type": "string"
    },
    "deal_token": {
      "type": "string"
    },
    "account_holder": {
      "type": "string",
      "description": "The company name as printed on the bank statement"
    }
  },
  "additionalProperties": false
}
provide_bank_details annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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
483 ms
95th percentile latency
483 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 483 ms · metadata changed · 10 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http up-to-tech-mcp https://upto.tech/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add up-to-tech-mcp --url https://upto.tech/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable up-to-tech-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "up-to-tech-mcp": {
      "url": "https://upto.tech/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "up-to-tech-mcp": {
      "type": "streamableHttp",
      "url": "https://upto.tech/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start up-to-tech-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "up-to-tech-mcp": {
      "type": "http",
      "url": "https://upto.tech/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http up-to-tech-mcp https://upto.tech/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://upto.tech/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "up-to-tech-mcp": {
      "serverUrl": "https://upto.tech/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Up To Tech MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Up To Tech 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.

Claim this listing