# Bidsketch MCP by usefulapi (remote · bidsketch.usefulapi.io)

Read Bidsketch clients, proposals, fees and templates; create and update clients, proposals, fees.

- Trust score: 62/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-25

## Components

- remote · `bidsketch.usefulapi.io`: 62/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch.md), [page](https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch)

## Channel facts

- Endpoint: `https://bidsketch.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.1.3`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-25.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3371 tokens (~116/item across 29 items; 29 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 90/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 71% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 29 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Bidsketch MCP by usefulapi server?

Bidsketch MCP by usefulapi is a hosted endpoint at https://bidsketch.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-bidsketch 'https://bidsketch.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-bidsketch": {
      "url": "https://bidsketch.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-bidsketch": {
      "type": "http",
      "url": "https://bidsketch.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-bidsketch]
url = "https://bidsketch.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-bidsketch": {
      "type": "remote",
      "url": "https://bidsketch.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-bidsketch --url 'https://bidsketch.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-bidsketch:
    url: "https://bidsketch.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-bidsketch": {
      "Transport": "http",
      "Url": "https://bidsketch.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-bidsketch -t streamable-http -u 'https://bidsketch.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-bidsketch": {
      "type": "http",
      "url": "https://bidsketch.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-25 (score 62, +1)

- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.1.0 → 1.1.3

### 2026-10-24 (score 61)

First indexed and scored.

## MCP tools (29)

### `bidsketch_list_clients` (~67 tokens)

List clients

List the clients (people or companies proposals are prepared for) with id, name, email and phone. GET /clients.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_get_client` (~55 tokens)

Get a client

Get one client with full contact details, address, notes and secondary contact. GET /clients/{id}.json.

Input parameters:

- `client_id` (integer, required): The client id from bidsketch_list_clients (a positive integer).

### `bidsketch_list_client_proposals` (~90 tokens)

List a client's proposals

List the proposals of one client with status (Pending, Viewed, Accepted, Declined) and draft flag. GET /clients/{id}/proposals.json.

Input parameters:

- `client_id` (integer, required): The client id (a positive integer).
- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_create_client` (~242 tokens)

Create a client

WRITE: create a client in Bidsketch. first_name, last_name and email are required (put a company name in `name`). Some Bidsketch plans cap the number of clients (HTTP 426 when reached). POST /clients.json.

Input parameters:

- `address_field_one` (string)
- `address_field_two` (string)
- `alt_phone` (string)
- `city` (string)
- `country` (string)
- `email` (string, required): Client's primary email address (required by Bidsketch).
- `first_name` (string, required): Client's first name (required by Bidsketch).
- `last_name` (string, required): Client's last name (required by Bidsketch).
- `name` (string): Client's full name or company name.
- `notes` (string): Notes about the client (plain text, not escaped).
- `other_contact` (object): Secondary contact; first_name, last_name and email are required when given.
- `phone` (string)
- `postal_zip` (string)
- `state` (string)
- `website` (string)

### `bidsketch_update_client` (~220 tokens)

Update a client

WRITE: change fields of an existing client; only the fields you pass are sent and overwrite the old values. PUT /clients/{id}.json.

Input parameters:

- `address_field_one` (string)
- `address_field_two` (string)
- `alt_phone` (string)
- `city` (string)
- `client_id` (integer, required): The client id (a positive integer).
- `country` (string)
- `email` (string): Client's primary email address.
- `first_name` (string): Client's first name (a person).
- `last_name` (string): Client's last name (a person).
- `name` (string): Client's full name or company name.
- `notes` (string): Notes about the client (plain text, not escaped).
- `other_contact` (object): Secondary contact; first_name, last_name and email are required when given.
- `phone` (string)
- `postal_zip` (string)
- `state` (string)
- `website` (string)

### `bidsketch_list_proposals` (~70 tokens)

List proposals

List all proposals with name, status (Pending, Viewed, Accepted, Declined), draft flag and dates. GET /proposals.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_get_proposal_stats` (~33 tokens)

Get proposal stats

Proposal statistics for the account (the total number of proposals). GET /proposals/stats.json.

### `bidsketch_get_proposal` (~77 tokens)

Get a proposal

Get one proposal: status, client, currency, fee subtotals and total, tax/discount, settings and counts of its opening sections, fees and closing sections. GET /proposals/{id}.json.

Input parameters:

- `proposal_id` (integer, required): The proposal id from bidsketch_list_proposals (a positive integer).

### `bidsketch_get_proposal_content` (~56 tokens)

Get a proposal's content

Get the full content of a proposal in order: opening sections, fees and closing sections. GET /proposals/{id}/content.json.

Input parameters:

- `proposal_id` (integer, required): The proposal id (a positive integer).

### `bidsketch_list_proposal_sections` (~80 tokens)

List a proposal's sections

List the text sections of one proposal (opening and closing). GET /proposals/{id}/sections.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).
- `proposal_id` (integer, required): The proposal id (a positive integer).

### `bidsketch_get_proposal_section` (~69 tokens)

Get a proposal section

Get one section of a proposal with its HTML description. GET /proposals/{id}/sections/{section_id}.json.

Input parameters:

- `proposal_id` (integer, required): The proposal id (a positive integer).
- `section_id` (integer, required): The proposal section id (a positive integer).

### `bidsketch_list_proposal_fees` (~85 tokens)

List a proposal's fees

List the fee lines of one proposal with type, totals and the optional flag. GET /proposals/{id}/fees.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).
- `proposal_id` (integer, required): The proposal id (a positive integer).

### `bidsketch_get_proposal_fee` (~66 tokens)

Get a proposal fee

Get one fee line of a proposal. GET /proposals/{id}/fees/{fee_id}.json.

Input parameters:

- `fee_id` (integer, required): The proposal fee id (a positive integer).
- `proposal_id` (integer, required): The proposal id (a positive integer).

### `bidsketch_create_proposal` (~270 tokens)

Create a proposal

WRITE: create a proposal for a client, optionally from a template (template_id from bidsketch_list_templates, which copies its sections and fees). The proposal is created as a draft; this tool does not send anything to the client. Some plans cap the number of proposals (HTTP 426). POST /proposals.json or POST /templates/{id}/proposals.json.

Input parameters:

- `client_id` (integer, required): The client the proposal is for (from bidsketch_list_clients) (a positive integer).
- `currency` (string): ISO currency code, e.g. USD.
- `description` (string, required): Summary of the proposal (the vendor docs list it with name and client_id as the minimum).
- `discount` (number): Discount as a decimal fraction (0.1 = 10%).
- `name` (string, required): Proposal name.
- `proposal_date` (string): Proposal date as m/d/yyyy, e.g. 10/26/2026.
- `tax` (number): Tax as a decimal fraction (0.1 = 10%).
- `tax2` (number): Secondary tax as a decimal fraction (0.1 = 10%).
- `template_id` (integer): Optional template to copy sections and fees from (a positive integer).

### `bidsketch_update_proposal` (~197 tokens)

Update a proposal

WRITE: change fields of a proposal; only the fields you pass are sent and overwrite the old values. PUT /proposals/{id}.json.

Input parameters:

- `client_id` (integer): Move the proposal to this client (a positive integer).
- `currency` (string): ISO currency code, e.g. USD.
- `description` (string): Summary of the proposal.
- `discount` (number): Discount as a decimal fraction (0.1 = 10%).
- `name` (string): Proposal name.
- `proposal_date` (string): Proposal date as m/d/yyyy, e.g. 10/26/2026.
- `proposal_id` (integer, required): The proposal id (a positive integer).
- `tax` (number): Tax as a decimal fraction (0.1 = 10%).
- `tax2` (number): Secondary tax as a decimal fraction (0.1 = 10%).

### `bidsketch_add_proposal_section` (~99 tokens)

Add a section to a proposal

WRITE: add a text section to a proposal, as an opening or closing section. POST /proposals/{id}/sections.json.

Input parameters:

- `description` (string, required): HTML-formatted content, for example <p>Hello</p>.
- `name` (string, required)
- `proposal_id` (integer, required): The proposal id (a positive integer).
- `sectiontype` (string, required): opening (shown first) or closing (shown last).

### `bidsketch_update_proposal_section` (~134 tokens)

Update a proposal section

WRITE: change a section of a proposal; only the fields you pass are sent and overwrite the old values. PUT /proposals/{id}/sections/{section_id}.json.

Input parameters:

- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `name` (string)
- `proposal_id` (integer, required): The proposal id (a positive integer).
- `section_id` (integer, required): The proposal section id (a positive integer).
- `sectiontype` (string): Where the section appears: opening (first) or closing (last).

### `bidsketch_add_proposal_fee` (~166 tokens)

Add a fee to a proposal

WRITE: add a fee line to a proposal; it changes the proposal's price. Fixed fees take amount as the total; hourly, monthly and yearly fees take amount per unit and a quantity. POST /proposals/{id}/fees.json.

Input parameters:

- `amount` (number, required)
- `category` (string)
- `description` (string, required): HTML-formatted content, for example <p>Hello</p>.
- `feetype` (string, required)
- `name` (string, required)
- `optional` (boolean): true = an optional item the client may choose.
- `proposal_id` (integer, required): The proposal id (a positive integer).
- `quantity` (integer): Quantity for calculated fees.
- `unit` (string): Unit label, only for custom fees.

### `bidsketch_update_proposal_fee` (~206 tokens)

Update a proposal fee

WRITE: change a fee line of a proposal (changes its price); only the fields you pass are sent. PUT /proposals/{id}/fees/{fee_id}.json.

Input parameters:

- `amount` (number): Fixed fee: the total. Calculated fee: the amount per unit.
- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `fee_id` (integer, required): The proposal fee id (a positive integer).
- `feetype` (string): fixed = a total; hourly/monthly/yearly = amount per unit x quantity; custom = your own unit label.
- `name` (string)
- `optional` (boolean): true = an optional item the client may choose.
- `proposal_id` (integer, required): The proposal id (a positive integer).
- `quantity` (integer): Quantity for calculated fees.
- `unit` (string): Unit label, only for custom fees.

### `bidsketch_list_fees` (~62 tokens)

List saved fees

List the reusable fees saved on the account with category, type and total. GET /fees.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_get_fee` (~55 tokens)

Get a saved fee

Get one saved fee with amount, quantity, unit and description. GET /fees/{id}.json.

Input parameters:

- `fee_id` (integer, required): The saved fee id from bidsketch_list_fees (a positive integer).

### `bidsketch_create_fee` (~107 tokens)

Create a saved fee

WRITE: save a reusable fee on the account (it is not added to any proposal). POST /fees.json.

Input parameters:

- `amount` (number, required)
- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `feetype` (string, required)
- `name` (string, required)
- `quantity` (integer): Quantity for calculated fees.
- `unit` (string): Unit label, only for custom fees.

### `bidsketch_update_fee` (~171 tokens)

Update a saved fee

WRITE: change a saved fee; only the fields you pass are sent. Proposals that already use it keep their own copy. PUT /fees/{id}.json.

Input parameters:

- `amount` (number): Fixed fee: the total. Calculated fee: the amount per unit.
- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `fee_id` (integer, required): The saved fee id (a positive integer).
- `feetype` (string): fixed = a total; hourly/monthly/yearly = amount per unit x quantity; custom = your own unit label.
- `name` (string)
- `quantity` (integer): Quantity for calculated fees.
- `unit` (string): Unit label, only for custom fees.

### `bidsketch_list_sections` (~64 tokens)

List saved sections

List the reusable content sections saved on the account with category and type (opening or closing). GET /sections.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_get_section` (~50 tokens)

Get a saved section

Get one saved section with its HTML description. GET /sections/{id}.json.

Input parameters:

- `section_id` (integer, required): The saved section id from bidsketch_list_sections (a positive integer).

### `bidsketch_create_section` (~76 tokens)

Create a saved section

WRITE: save a reusable content section on the account (it is not added to any proposal). POST /sections.json.

Input parameters:

- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `name` (string, required)
- `sectiontype` (string, required)

### `bidsketch_update_section` (~115 tokens)

Update a saved section

WRITE: change a saved section; only the fields you pass are sent. Proposals that already use it keep their own copy. PUT /sections/{id}.json.

Input parameters:

- `category` (string)
- `description` (string): HTML-formatted content, for example <p>Hello</p>.
- `name` (string)
- `section_id` (integer, required): The saved section id (a positive integer).
- `sectiontype` (string): Where the section appears: opening (first) or closing (last).

### `bidsketch_list_templates` (~67 tokens)

List proposal templates

List the proposal templates saved on the account. Use a template id with bidsketch_create_proposal. GET /templates.json.

Input parameters:

- `page` (integer): Page number (default 1).
- `per_page` (integer): Results per page (default and maximum 100).

### `bidsketch_get_template` (~54 tokens)

Get a proposal template

Get one template with the saved sections and fees it is made of. GET /templates/{id}.json.

Input parameters:

- `template_id` (integer, required): The template id from bidsketch_list_templates (a positive integer).

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch#diagnostics

## Score history

- 2026-10-25: 62
- 2026-10-24: 61

## Common questions

### What is the Bidsketch MCP by usefulapi server?

Bidsketch MCP by usefulapi is listed in the public MCP registry as io.usefulapi/bidsketch. Read Bidsketch clients, proposals, fees and templates; create and update clients, proposals, fees. This page covers its hosted endpoint (https://bidsketch.usefulapi.io/mcp).

### Is the Bidsketch MCP by usefulapi server safe to use?

Bidsketch MCP by usefulapi scores 62 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Bidsketch MCP by usefulapi server expose?

Bidsketch MCP by usefulapi exposes 29 tools: bidsketch_list_clients, bidsketch_get_client, bidsketch_list_client_proposals, bidsketch_create_client, bidsketch_update_client, and 24 more. Their descriptions and schemas cost roughly 3,103 tokens of context every time the server is loaded.

### Does the Bidsketch MCP by usefulapi server require authentication?

Yes. Bidsketch MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the Bidsketch MCP by usefulapi server still maintained?

Bidsketch MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://bidsketch.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/bidsketch/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-bidsketch/bidsketch
