Design primers
Design against a template
Explain counts stay on. Positions are 0-based, which is Primer3's default. This calls the real libprimer3 2.6.1.
Primer3 is designing…
Why the others were rejected
Worked examples
Five public designs
Click one. It fills the playground and runs on libprimer3. A sixth card is the case built to return nothing. The scoring fixtures stay off this list.
Text ↔ JSON
Boulder and JSON, same record
One Boulder record, including the line that is only =, becomes one JSON object. Tag names stay the keys. Numbers keep Primer3's text when you use the MCP tools. This form shows the same mapping.
Referee scoring
Score a submission
Paste the input you ran and the output you got. The server runs Primer3 again and compares. Exact means the same tags and the same number text: 55.000 is not 55. A tolerance above 0 changes the score and the diff, and it does not make a fuzzy match exact.
Connect an agent
Point an agent at this server
The same process serves a Model Context Protocol endpoint over streamable HTTP.
Tools
| Tool | What it does |
|---|---|
run_primer3 | JSON record in. JSON record out, plus the Boulder text and the pinned version and thermodynamic tables. |
get_example | One public example's input, or the list of five when id is omitted. |
list_parameters | Documented tags and the version-2 defaults. Other Boulder tags are still accepted. |
validate_submission | Reruns the input and scores the output. numericTolerance defaults to 0. |
boulder_to_json | One Boulder record, including the = line, to canonical JSON. |
json_to_boulder | Canonical JSON back to Boulder. |
Prompt
Fetch build_compatible_primer3 with prompts/get before writing code. It describes Primer3, why this server is a referee, and the Boulder/JSON contract a compatible service has to meet so you can test it with validate_submission.
A call
Send Accept: application/json, text/event-stream. After initialize, keep the Mcp-Session-Id header. On this machine, DNS-rebinding protection allows localhost. The container image turns that off because the Cloudflare Worker is the public front door.