{"name":"io.github.Mad-Man-Dan/karbon-mcp-server","slug":"mad-man-dan-karbon-mcp-server","title":null,"description":"Unofficial MCP server for Karbon practice management: contacts, work, time, invoices, payments.","url":"https://mcp.market/server/mad-man-dan-karbon-mcp-server","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":19,"stars":0,"forks":0,"downloads_week":59,"last_push_at":"2026-07-16T05:42:35.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Mad-Man-Dan/karbon-mcp-server","website":null,"version":"0.2.4","remotes":[],"packages":[{"registryType":"npm","identifier":"karbon-mcp-server","version":"0.2.4","transport":{"type":"stdio"},"environmentVariables":[{"description":"Bearer token (Application Authorization Token) from Karbon → Settings → Connected Apps → API Applications","isRequired":true,"format":"string","isSecret":true,"name":"KARBON_BEARER_TOKEN"},{"description":"Access key (JWT starting with 'ey') from Karbon → Settings → Connected Apps → API Applications","isRequired":true,"format":"string","isSecret":true,"name":"KARBON_ACCESS_KEY"},{"description":"Set to 'true' to disable all create/update tools (they are not registered at all)","format":"string","name":"KARBON_READ_ONLY"},{"description":"Set to 'true' to enable the payment write tools (create/delete/reverse manual payments); off by default","format":"string","name":"KARBON_ALLOW_PAYMENT_WRITES"}]}],"tools":[{"name":"add_team_members","description":"Add one or more users to a team by their UserKeys (find them with list_users). Users already on the team are skipped. Team membership can affect work visibility and assignment — confirm with the user before changing it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_client_group","description":"Create a new client group in Karbon. Members are existing contacts and/or organizations.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_contact","description":"Create a new person contact in Karbon.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_custom_field","description":"Create a new custom field definition for the whole Karbon tenant. This changes the firm's shared configuration, not just one record — state the field name, type, and visibility to the user and get their explicit confirmation before calling.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_manual_payment","description":"Record a manual payment against an invoice. The amount must be greater than 0 and no more than the invoice's outstanding balance. This creates a financial record — confirm the details with the user before calling.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_note","description":"Create a note in Karbon, optionally linked to work items, contacts, organizations, or client groups via timelines. Notes linked to a work item also appear on the client's timeline.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_organization","description":"Create a new organization contact in Karbon.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_work_item","description":"Create a new work item in Karbon. WorkType and status values are tenant-specific — call get_tenant_settings first if unsure.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_work_schedule","description":"Create a recurring work schedule from an existing work item. The schedule will automatically generate new work items on the recurrence you set — confirm the recurrence details with the user before calling. Note: RecurrenceFrequency cannot be changed after creation.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_custom_field","description":"DESTRUCTIVE AND IRREVERSIBLE: deleting a custom field definition permanently removes the field AND every value stored in it across all contacts, organizations, and client groups in the tenant. Never call this without first telling the user exactly which field will be deleted (by name, via list_custom_fields) and receiving their explicit confirmation for that specific field.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_manual_payment","description":"Delete a manual payment by its ManualPaymentKey. This removes a financial record — confirm with the user before calling. Only payments created manually can be deleted.","write_action":true,"price_micros":0,"input_schema":null},{"name":"download_file","description":"Download a Karbon file to a local path on the machine running this MCP server. Get the DownloadUrl from list_entity_files first — download links expire after 15 minutes, so re-list if the download fails with an auth error. Ask the user where to save before writing outside a temp directory, and never overwrite a file the user didn't ask you to replace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_business_card","description":"Get a single business card by BusinessCardKey. Business cards hold the contact details (email, phone, address, websites) of a contact, organization, or client group. Find the key by expanding BusinessCards on get_contact / get_organization / get_client_group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_client_group","description":"Get a single client group by ClientGroupKey — or by your own UserDefinedIdentifier — optionally expanding related data (BusinessCard, ClientTeam). Includes the group's members (contacts and organizations). Provide exactly one of clientGroupKey or userDefinedIdentifier.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_comment","description":"Get a single comment by its CommentKey. Comments appear on work item and client timelines alongside notes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_contact","description":"Get a single person contact by ContactKey — or by your own UserDefinedIdentifier — optionally expanding related data (BusinessCards, AccountingDetail, ClientTeam). Provide exactly one of contactKey or userDefinedIdentifier.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_custom_field_values","description":"Get the custom field values set on a specific entity (contact, organization, or client group) by its entity key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_estimate_summary","description":"Get the estimate summary for a work item (read-only): budgeted vs. actual time and value. Useful for 'are we over budget on this job' questions — pair with list_time_entries for detail.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_invoice","description":"Get a single invoice by InvoiceKey (read-only), optionally expanding related data (LineItems, Payments, Data).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_note","description":"Get a single note by its NoteID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_organization","description":"Get a single organization by OrganizationKey — or by your own UserDefinedIdentifier — optionally expanding related data (BusinessCards, AccountingDetail, ClientTeam, Contacts). Provide exactly one of organizationKey or userDefinedIdentifier.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_payment","description":"Get a single payment by PaymentKey (read-only).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_team","description":"Get a single team by TeamKey, including its members (users and sub-teams).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_tenant_settings","description":"Get this Karbon account's configuration: valid work statuses (secondary statuses), work types, and contact types. Call this before creating or updating work items or contacts with tenant-specific values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_time_entry","description":"Get a single individual time entry by its IndividualTimeEntryKey (read-only).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_timesheet","description":"Get a single timesheet by TimesheetKey, optionally expanding TimeEntries.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user","description":"Get a single Karbon user by their UserId.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_work_item","description":"Get a single work item by WorkItemKey.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_work_schedule","description":"Get a recurring work schedule by WorkScheduleKey — the recurrence rules that automatically generate work items.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_work_template","description":"Get a single work template by WorkTemplateKey, including its task and section structure.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_client_groups","description":"List or search client groups in Karbon. Supports OData filtering, e.g. filter: \"contains(FullName,'Smith Family')\" or \"UserDefinedIdentifier eq 'ABC123'\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_contacts","description":"List or search person contacts in Karbon. Supports OData filtering, e.g. filter: \"contains(FullName,'Smith')\" or \"ContactType eq 'Client'\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_custom_fields","description":"List all custom field definitions for the Karbon tenant — field names, types (Text, Number, Date, Boolean, Colleague, ListSingleSelect, ListMultipleSelect), list options, and which entities they apply to.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_entity_files","description":"List the files attached to a work item, contact, or organization — name, size, mime type, created date, and a DownloadUrl usable with download_file. Download links expire 15 minutes after this call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_invoices","description":"List invoices in Karbon (read-only). Supports OData filtering, e.g. filter: \"InvoiceStatus eq 'AwaitingPayment'\" or \"TotalAmountDue gt 0\". Statuses: Approved, AwaitingPayment, Paid, Exported, Voided.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_organizations","description":"List or search organization contacts in Karbon. Supports OData filtering, e.g. filter: \"contains(FullName,'Acme')\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_payments","description":"List payments recorded against invoices in Karbon (read-only). Supports pagination only — the Payments endpoint does not accept OData filters.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_teams","description":"List teams in Karbon (read-only). Supports OData filtering, e.g. filter: \"contains(Name,'Tax')\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_time_entries","description":"List individual time entries (read-only). Useful for reporting on time logged against clients or work items.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_timesheets","description":"List timesheets (read-only). Useful filters: \"StartDate ge 2026-07-01\", \"UserKey eq '...'\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_users","description":"List Karbon users (team members) on this account.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_work_items","description":"List or search work items (jobs/engagements) in Karbon. Useful filters: \"PrimaryStatus eq 'InProgress'\", \"AssigneeEmailAddress eq 'user@firm.com'\", \"DueDate lt 2026-08-01\". PrimaryStatus values: Planned, ReadyToStart, InProgress, Waiting, Completed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_work_templates","description":"List work templates available on this account. Use a WorkTemplateKey with create_work_item to create templated work.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_team_member","description":"Remove a user from a team by their UserKey. Team membership can affect work visibility and assignment — confirm with the user before changing it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"reverse_manual_payment","description":"Reverse a manual payment, restoring the amount to the invoice's balance. This creates a reversal record rather than deleting the payment — confirm with the user before calling.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_custom_field_values","description":"Set custom field values on an entity (contact, organization, or client group). Use list_custom_fields for the available definitions and get_custom_field_values to see what's currently set. Values are always passed as an array of strings, even for single values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_business_card","description":"Update a business card (full replace via PUT) — this is how you change a contact's, organization's, or client group's email addresses, phone numbers, and addresses. Fetch the card first with get_business_card and send back the complete card with your changes, since omitted fields are cleared.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_client_group","description":"Update fields on an existing client group (partial update via PATCH). Only include the fields you want to change.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_contact","description":"Update fields on an existing person contact (partial update via PATCH). Only include the fields you want to change.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_organization","description":"Update fields on an existing organization (partial update via PATCH). Only include the fields you want to change.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_work_item","description":"Update fields on an existing work item (partial update via PATCH). Only include the fields you want to change.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_work_schedule","description":"Update a work schedule (partial via PATCH). The API only supports changing the end date and the assignee here. Note: changing AssigneeUserKey reassigns every not-yet-started work item the schedule has generated — confirm with the user first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upload_file","description":"Upload a file to Karbon and attach it to a work item, contact, organization, or client group (at least one key is required).","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-09-25T21:44:16.246Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T21:44:16.187Z","components":{"code":{"score":25,"max":25,"notes":["22 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 72 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"karbon-mcp-server","version":"0.2.4","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-07-16T05:43:28.185Z","repositoryUrl":"git+https://github.com/Mad-Man-Dan/karbon-mcp-server.git","weeklyDownloads":59}],"repo":{"found":true,"owner":"Mad-Man-Dan","repo":"karbon-mcp-server","archived":false,"pushedAt":"2026-07-16T05:42:35Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/155039844?v=4","ownerCreatedAt":"2023-12-28T03:26:45Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/155039844?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":59,"license":"MIT","lastPushAt":"2026-07-16T05:42:35.000Z","score":19}}}},"grade_history":[],"reviews":[]}