MCP Server

service-agreement

io.github.theluckystrike/service-agreement
Business & Operations Legal & Compliance Public & reachable MCP 2026-07-28

What this MCP does

Creates, checks, stores, renders, and tracks freelance service agreements covering scope, payment, termination, liability, and signatures.

agreement_checklist
Check an agreement before you send it
The before-you-send-it checklist for one agreement: every missing field is listed, and terms whose absence cuts one way are flagged neutrally -- as written, what the gap means for both parties -- such as no termination clause or an uncapped liability. Reads only.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['agreement'], 'properties': {'agreement': {'type': 'string', 'maxLength': 200, 'description': 'The agreement id, e.g. SA-2026-0003, or the client name when only one agreement has it'}}, 'additionalProperties': False}
agreement_create
Write a service agreement
Write a service agreement between a freelancer and a client before the work starts: the parties, the scope of services, the deliverables, the rate and payment terms, start and end dates, a termination notice period, a liability cap and the governing jurisdiction. Stores the agreement and returns it rendered as clean Markdown with a signature block. Free tier: 3 active agreements; expiring a finished one frees its slot.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['freelancer', 'client', 'scope', 'deliverables', 'rate_cents', 'rate_unit', 'currency', 'payment_terms'], 'properties': {'note': {'type': 'string', 'maxLength': 4000}, 'scope': {'type': 'string', 'maxLength': 4000, 'description': 'The services the freelancer provides, e.g. Design and build of a five-page marketing site, with two weeks of post-launch fixes'}, 'client': {'type': 'string', 'maxLength': 200, 'description': 'Who the work is for, e.g. Brightleaf Studio'}, 'clauses': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40}, 'maxItems': 20, 'description': 'Ids of library clauses to include, from clause_library: ip_assignment, confidentiality, late_payment, kill_fee, revision_rounds. The clause library is a Pro feature'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$', 'description': 'ISO code the rate and cap are in'}, 'end_date': {'type': 'string', 'maxLength': 10, 'description': 'The date the engagement ends, YYYY-MM-DD. Leave unset for an open-ended engagement'}, 'rate_unit': {'enum': ['hour', 'day', 'project'], 'type': 'string', 'description': 'What the rate buys: an hour, a day, or the whole project'}, 'freelancer': {'type': 'string', 'maxLength': 200, 'description': 'Who does the work, e.g. Anna Nowak, or Nowak Design'}, 'rate_cents': {'type': 'integer', 'maximum': 100000000000000, 'minimum': 0, 'description': 'The rate in whole cents. 8500 is 85.00'}, 'start_date': {'type': 'string', 'maxLength': 10, 'description': 'The date work begins, YYYY-MM-DD. May be in the future; it is a plan, not a log'}, 'deliverables': {'type': 'array', 'items': {'type': 'string', 'maxLength': 400}, 'maxItems': 50, 'minItems': 1, 'description': 'What the client receives at the end, e.g. ["Five-page site deployed to the client\'s host", "Handover document"]'}, 'jurisdiction': {'type': 'string', 'maxLength': 300, 'description': 'The governing law and courts, e.g. England and Wales, or the State of New York'}, 'payment_terms': {'type': 'string', 'maxLength': 500, 'description': 'When and how it is paid, e.g. Net 14 from invoice date, or 50% on signing and 50% on delivery'}, 'client_address': {'type': 'string', 'maxLength': 400}, 'freelancer_address': {'type': 'string', 'maxLength': 400}, 'liability_cap_cents': {'type': 'integer', 'maximum': 100000000000000, 'minimum': 0, 'description': 'The most the freelancer can be liable for, in whole cents. Leave unset and liability is uncapped, which the checklist flags'}, 'termination_notice_days': {'type': 'integer', 'maximum': 365, 'minimum': 0, 'description': 'Days of written notice either party must give to end the agreement, e.g. 14'}}, 'additionalProperties': False}
agreement_get
Read one agreement
Read one service agreement in full by SA number or client name: parties, scope, deliverables, rate and payment terms, dates, termination, liability cap, jurisdiction, the clauses it carries, its status and its status history. Reads only.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['agreement'], 'properties': {'agreement': {'type': 'string', 'maxLength': 200, 'description': 'The agreement id, e.g. SA-2026-0003, or the client name when only one agreement has it'}}, 'additionalProperties': False}
agreement_list
List agreements
List service agreements newest first: parties, status, rate, dates and the clauses each carries. Filter by status and by client. An agreement is active until it is expired; the free tier holds 3 active agreements.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'client': {'type': 'string', 'maxLength': 200, 'description': 'Only agreements whose client contains this text, case-insensitive'}, 'status': {'type': 'string', 'maxLength': 20, 'description': 'Only agreements at this status: draft, sent, signed, expired'}}, 'additionalProperties': False}
agreement_render
Render an agreement for signing
Render a service agreement ready to send and sign: the parties, the services, the deliverables, the payment terms, the term, termination, liability, jurisdiction, any library clauses it carries, and a signature block for both parties. Markdown, or self-contained HTML with print CSS that needs nothing from the network. HTML is a Pro feature. Writes nothing.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['agreement'], 'properties': {'format': {'enum': ['markdown', 'html'], 'type': 'string', 'description': 'markdown (default) or html. The HTML carries its own styling and references nothing external. HTML is a Pro feature'}, 'agreement': {'type': 'string', 'maxLength': 200, 'description': 'The agreement id, e.g. SA-2026-0003, or the client name when only one agreement has it'}}, 'additionalProperties': False}
agreement_update_status
Move an agreement one step
Move one agreement exactly one step: draft, sent, signed, expired, stamping the date and an optional note into its history. A skipped or backwards step is refused and nothing is written. Expiring a finished engagement frees a free-tier slot.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['agreement', 'status'], 'properties': {'date': {'type': 'string', 'maxLength': 10, 'description': 'The date to stamp the step with, YYYY-MM-DD. Default today'}, 'note': {'type': 'string', 'maxLength': 4000}, 'status': {'type': 'string', 'maxLength': 20, 'description': 'The next step for this agreement: draft, sent, signed, expired'}, 'agreement': {'type': 'string', 'maxLength': 200, 'description': 'The agreement id, e.g. SA-2026-0003, or the client name when only one agreement has it'}}, 'additionalProperties': False}
clause_library
List the built-in clause library
List the built-in clause library: intellectual property assignment, mutual confidentiality, late payment interest, kill fee and revision rounds. Each clause is a title plus a body text. Pass an agreement and, on Pro, every body comes back with that agreement's variables filled in. The free tier lists titles and summaries; the full texts are a Pro feature.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'agreement': {'type': 'string', 'maxLength': 200, 'description': "Fill each clause body with this agreement's variables. Pro feature"}}, 'additionalProperties': False}
license_activate
Activate license
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['key'], 'properties': {'key': {'type': 'string', 'description': 'License key from checkout, MCPL1.<payload>.<signature>'}}, 'additionalProperties': False}
license_status
License status
Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Changed
license_activate
Sept. 22, 2026, 2:40 a.m.
Changed
license_status
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_checklist
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_render
Sept. 22, 2026, 2:40 a.m.
Changed
clause_library
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_update_status
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_list
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_get
Sept. 22, 2026, 2:40 a.m.
Changed
agreement_create
Sept. 22, 2026, 2:40 a.m.
Added
license_activate
Sept. 18, 2026, 2:40 a.m.
Added
license_status
Sept. 18, 2026, 2:40 a.m.
Added
agreement_checklist
Sept. 18, 2026, 2:40 a.m.
Added
agreement_render
Sept. 18, 2026, 2:40 a.m.
Added
clause_library
Sept. 18, 2026, 2:40 a.m.
Added
agreement_update_status
Sept. 18, 2026, 2:40 a.m.
Added
agreement_list
Sept. 18, 2026, 2:40 a.m.
Added
agreement_get
Sept. 18, 2026, 2:40 a.m.
Added
agreement_create
Sept. 18, 2026, 2:40 a.m.