Kulhad
REMOTE · KULHAD.CO
Run a UPI creator support page from chat: supporters, goals, page, share assets. No money moves.
Available components
Last scanned (4 hours ago)
Scores higher than 69% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Finance and Payments
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. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (update_profile). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability83
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 4300 tokens (~97/item across 44 items; 44 tools + 0 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management70
- Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage91
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 67% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 45 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://kulhad.co/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=kulhad.co | CN=WE1,O=Google Trust Services,C=US | 31 Oct 2026 | 29 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | f71e2925d8a22ab313167f79416acf7d |
| SANs: kulhad.co, *.kulhad.co | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of kulhad.co. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| co. | present | 7786 | 8 | Verified |
| kulhad.co. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | default-src 'self'; base-uri 'self'; object-src 'none'; form-action 'self'; frame-ancestors 'self'; script-src 'self' 'unsafe-inline' https://challenges.cloudflare.com https://static.cloudflareinsights.com https://js.stripe.com https://checkout.razorpay.com https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; media-src 'self' blob: https:; font-src 'self' data: https://cdn.razorpay.com; worker-src 'self' blob:; frame-src 'self' https://challenges.cloudflare.com https://js.stripe.com https://hooks.stripe.com https://m.stripe.network https://api.razorpay.com https://checkout.razorpay.com; connect-src 'self' https://challenges.cloudflare.com https://api.stripe.com https://m.stripe.network https://r.stripe.com https://static.cloudflareinsights.com https://api.razorpay.com https://lumberjack.razorpay.com https://*.google-analytics.com https://www.google-analytics.com https://*.analytics.google.com https://stats.g.doubleclick.net |
| x-content-type-options | nosniff |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), geolocation=(), payment=*, microphone=(self) |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://kulhad.co/mcp | Verified | 200 | |
| http (plaintext) | http://kulhad.co/mcp | HTTPS enforced | 308 | https://kulhad.co/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_upi_id Add a UPI ID ~127
Add a UPI ID for supporters to pay into. Kulhad cannot check that an address is real or that it belongs to the creator, so tell them to send one rupee to it themselves and confirm it arrived before sharing the page. Duplicates are not checked. The free plan keeps one ID active at a time.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | – | What to call it, such as Personal or Shop. |
| makeDefault | boolean | – | Quote this one first. |
| vpa | string | yes | The UPI address, as in priya@okhdfc. |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| nextStep | string | yes | – |
| vpa | string | yes | – |
No examples provided.
approve_support Approve a supporter ~218
Approve one supporter after the creator has found the payment in their own bank app. This cannot be undone. The supporter's name and amount then show on the creator's page and stream overlays and count toward totals and the active goal; if that fills the goal, the goal is marked complete and taken off the page. With hidden set, the message and any voice recording stay private while the name and amount still show. A thank-you reply (up to 280 characters, word-filtered) can be set at the same time and replaces any existing reply. Nothing is sent to the supporter. Only the creator can know whether the money arrived, so never approve without being asked to for that specific supporter.
| Name | Type | Req | Description |
|---|---|---|---|
| hidden | boolean | – | Keep the message and any voice recording private. The name and amount still show on the page. |
| id | integer | yes | – |
| reply | string | – | A thank-you shown beside them on the page, up to 280 characters. Replaces any existing reply. Refused if the word filter flags it. |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| status | string | yes | – |
No examples provided.
bulk_approve_supports Approve several supporters ~108
Approve up to 100 waiting supporters at once after the creator has checked their bank. Part of Premium. This cannot be undone. Ids that are not waiting (already settled, not yet marked as sent, missing, or not this creator's) are skipped and counted. Same effects as approve_support; no reply is set.
| Name | Type | Req | Description |
|---|---|---|---|
| hidden | boolean | – | Keep each message and voice recording private. Names and amounts still show on the page. |
| ids | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| approved | number | yes | – |
| skipped | number | yes | – |
No examples provided.
bulk_reject_supports Reject several supporters ~64
Reject up to 100 waiting supporters at once. Part of Premium. This cannot be undone and any voice recordings are deleted immediately, so confirm the list with the creator first. Ids that are not waiting are skipped and counted.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| rejected | number | yes | – |
| skipped | number | yes | – |
No examples provided.
check_username_available Check a page name ~75
Check whether a Kulhad page name is free. A page name is the last part of the address, as in kulhad.co/priya. Use this before suggesting a name to somebody setting up a page.
| Name | Type | Req | Description |
|---|---|---|---|
| username | string | yes | The page name to check, without the address around it. For example: priya |
| Name | Type | Req | Description |
|---|---|---|---|
| available | boolean | yes | – |
| reason | – | yes | Why it cannot be used, when it cannot. |
| suggestions | array | yes | Nearby names that are free, when the first is not. |
| url | – | yes | The address this name would give, when it is free. |
| username | string | yes | – |
No examples provided.
create_goal Create a goal ~169
Create a goal with a title and a target in whole rupees. Unless active is false, it becomes the goal shown on the page and any other goal is put away, not deleted (set_active_goal brings one back). The free plan refuses while another goal is running, even with active false. Impact tiers are Premium. A goal that is neither active nor complete has no page of its own.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Show it on the page straight away. |
| deadline | – | – | As YYYY-MM-DD. Null clears it. A goal does not stop at its deadline. |
| description | string | – | – |
| impact | array | – | What each amount pays for, shown on the goal. Premium. |
| targetAmount | integer | yes | In whole rupees. |
| title | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
delete_goal Delete a goal ~65
Delete a goal that has no approved support. This cannot be undone, and its cover image is deleted with it. Pending or rejected supports pinned to it lose the link. A goal with approved support stays in the history and can only be turned off.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | yes | – |
| id | number | yes | – |
No examples provided.
delete_goal_update Remove a progress note ~56
Remove one progress note from a goal by its position in the list, counting from zero with the newest first. This cannot be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| goalId | integer | yes | – |
| index | integer | yes | Zero is the newest note. |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
get_analytics Read my page numbers ~75
Daily page views, approved supports and amounts for up to the last ninety days, thirty by default, with the rate at which visitors go on to support. Part of Premium. Comes from the nightly rollup, so today is not included and only days with activity are returned.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | How many days back. |
| Name | Type | Req | Description |
|---|---|---|---|
| days | array | yes | – |
| totals | object | yes | – |
No examples provided.
get_custom_domain Read my custom domain ~31
Read whether a custom domain is connected to the page, and what DNS record it needs. Part of Premium.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | yes | – |
| instructions | string | yes | – |
| status | string | yes | none, pending or active |
| target | string | yes | What the DNS record has to point at. |
No examples provided.
get_dashboard_summary Read my dashboard summary ~47
The headline numbers from the creator dashboard: what came in this month against last, the all-time total, how many approved supports there have been, and how many are waiting to be approved.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| allTime | object | yes | – |
| changePercent | – | yes | This month against last, as a percentage. Null when last month was nothing. |
| lastMonth | object | yes | – |
| thisMonth | object | yes | – |
| waitingForApproval | number | yes | Supporters who have marked a payment as sent and are waiting on the creator. |
No examples provided.
get_embed_code Get code to put Kulhad on my own website ~73
Get the HTML to put a support button, the pay card, or a live goal bar on the creator own website or blog. Returns the snippets to paste, not a rendered preview.
| Name | Type | Req | Description |
|---|---|---|---|
| position | string | – | Which bottom corner the floating button sits in. |
| text | string | – | The words on the button. |
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | yes | A script tag that draws a support button. |
| buttonImage | string | yes | A plain image link, for places that allow no script. |
| goalBar | string | yes | An iframe with the live goal progress bar. |
| payCard | string | yes | An iframe with the whole pay card in it. |
| plainLink | string | yes | – |
No examples provided.
get_goal Read one goal ~30
Read one goal in full, including its impact tiers and its progress notes.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
get_my_profile Read my page details ~50
Read the page details for the signed-in creator: name, page address, bio, links, language, plan, and any custom domain recorded on the account with its status (pending, active or disabled).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| bioText | – | yes | The bio as plain text. |
| customDomain | – | yes | – |
| kind | – | yes | person or organization |
| name | – | yes | – |
| onboarded | boolean | yes | – |
| pageLanguage | – | yes | – |
| plan | string | yes | – |
| premiumUntil | – | yes | – |
| socials | array | yes | – |
| uiLanguage | – | yes | – |
| url | string | yes | – |
| username | string | yes | – |
No examples provided.
get_page_settings Read how my page looks and behaves ~38
Read the current appearance and behaviour settings for the page: theme, banner, suggested amounts, what is shown publicly, and the thank-you note.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| allowAnonymous | boolean | yes | – |
| amountStyle | – | yes | – |
| amounts | array | yes | – |
| autoPublish | boolean | yes | – |
| badgeHidden | boolean | yes | – |
| cardHeadline | – | yes | – |
| counterQrEnabled | boolean | yes | – |
| gaMeasurementId | – | yes | – |
| occasion | object | yes | – |
| savedReplies | array | yes | – |
| seo | object | yes | – |
| showSupporterCount | boolean | yes | – |
| showTotalRaised | boolean | yes | – |
| thankYouNote | – | yes | – |
| theme | – | yes | – |
| themeColor | – | yes | – |
| voiceBlessingsEnabled | boolean | yes | – |
No examples provided.
get_plan_and_billing Read my plan and billing history ~55
Read which plan the account is on, when Premium runs to, whether it is set to end, and the past charges with links to their invoices. Read-only: nothing here starts, changes or cancels a subscription.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| charges | array | yes | – |
| manageUrl | string | yes | Where a human changes any of this. |
| plan | string | yes | free or premium |
| premiumUntil | – | yes | – |
| subscription | – | yes | – |
No examples provided.
get_share_assets Get my page link, QR code and share images ~67
Get the page address, a QR code that opens the page (and a UPI payment QR for the counter when the counter QR is switched on), share images for stories and posts, and the printable sheets. Everything comes back as a link to open or download, not as an image.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| pageUrl | string | yes | – |
| printable | object | yes | – |
| qr | object | yes | – |
| shareCards | object | yes | – |
| whatsappText | string | yes | Ready to paste into a message. |
No examples provided.
get_stream_overlays Get my stream overlay addresses for OBS ~119
Get the three overlay addresses to add to OBS or any streaming software as a browser source: a goal bar, a wall of recent supporters, and an alert that appears when someone gives. Includes the size each source should be and when alerts currently fire.
| Name | Type | Req | Description |
|---|---|---|---|
| alertSeconds | integer | – | How long each alert stays on screen. |
| language | string | – | Which language the overlays speak. "page" follows the page language and keeps following it if that changes later. |
| wallRows | integer | – | How many supporters the wall shows at once. |
| Name | Type | Req | Description |
|---|---|---|---|
| addToObs | array | yes | The steps to add one of these in OBS. |
| alert | object | yes | – |
| alertsFireOn | string | yes | When the alert overlay reacts. "approved" is after the creator has looked at a support; "claimed" is as soon as a supporter marks a payment as sent, which is faster but unreviewed. |
| goal | object | yes | – |
| wall | object | yes | – |
No examples provided.
get_support Read one supporter ~38
Read everything the creator can see about one supporter, by its id.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | From list_supports or list_pending_supports. |
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | – |
| amountFormatted | string | yes | – |
| approvedAt | – | yes | – |
| code | – | yes | The four-character reference in the payment note. Absent for counter QR payments. |
| flagged | boolean | yes | The word filter flagged the message. It is not blocked. |
| hasVoiceMessage | boolean | yes | – |
| id | number | yes | – |
| markedPaidAt | – | yes | – |
| message | – | yes | – |
| reply | – | yes | The public thank-you the creator wrote. |
| source | – | yes | Which link or surface it came from. |
| startedAt | – | yes | – |
| status | string | yes | claimed, approved, approved_hidden or rejected |
| supporterName | – | yes | Absent when they chose to stay anonymous. |
No examples provided.
get_support_sources Read where my supporters came from ~97
Break approved support down by where it came from: the page itself, an embedded button, a QR code, the printed counter card, or a link tagged for WhatsApp, Instagram, YouTube or a standee. Use this to answer which channel is actually working.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Only from this date onward, as YYYY-MM-DD. |
| to | string | – | Only up to this date, as YYYY-MM-DD. |
| Name | Type | Req | Description |
|---|---|---|---|
| sources | array | yes | – |
| total | number | yes | – |
| totalFormatted | string | yes | – |
No examples provided.
get_wrapped Read my year in review ~54
Kulhad Wrapped for a year: how many people supported, the total, page views, the busiest month, and the largest single support. Free on every plan.
| Name | Type | Req | Description |
|---|---|---|---|
| year | integer | – | Defaults to the current year. |
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | – |
| amountFormatted | string | yes | – |
| biggestMonth | – | yes | – |
| months | array | yes | – |
| supports | number | yes | – |
| topSupport | – | yes | – |
| views | number | yes | – |
| year | number | yes | – |
No examples provided.
list_goals List my goals ~31
List every goal on the page, the active one first, with how much each has raised against its target.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| goals | array | yes | – |
No examples provided.
list_pending_supports List supporters waiting for approval ~83
List the supporters who have marked a payment as sent and are waiting for the creator to approve them. Kulhad cannot see a bank account, so this is what people say they sent, not what has been received. The creator checks their own bank app for the amount and the four-character code, then approves.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many to return. |
| Name | Type | Req | Description |
|---|---|---|---|
| supports | array | yes | – |
| total | number | yes | How many are waiting in all. |
| totalAmount | number | yes | What all of them add up to, not only the ones returned. |
| totalAmountFormatted | string | yes | – |
No examples provided.
list_supports List my supporters ~108
List supporters, newest first, optionally narrowed by status or by date. Use this for history and for questions about a particular period; use list_pending_supports for the approval queue.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Only from this date onward, as YYYY-MM-DD. |
| limit | integer | – | – |
| page | integer | – | – |
| status | string | – | claimed means waiting for the creator to approve. |
| to | string | – | Only up to this date, as YYYY-MM-DD. |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | yes | – |
| page | number | yes | – |
| supports | array | yes | – |
| total | number | yes | – |
No examples provided.
list_upi_ids List my UPI IDs ~39
List the UPI IDs on the account, which are the addresses supporters pay into. The free plan keeps one of them active at a time.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| rotation | boolean | yes | Active IDs take turns being quoted, so support spreads across them. Premium. |
| upiIds | array | yes | – |
No examples provided.
post_goal_update Post a progress note on a goal ~90
Add a short note, up to 280 characters, under a goal saying what the money did. Notes are kept newest first, at most 20 per goal, and show on the goal's page while the goal is active or complete. Free on every plan. Nobody is notified.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | What happened. Shown publicly under the goal. |
| goalId | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
reject_support Reject a supporter ~66
Reject one supporter when the creator has checked their bank and the payment is not there. This cannot be undone. Any voice recording is deleted immediately; the record itself is cleared a week later. Nothing shows on the page and nothing is sent to the supporter.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| status | string | yes | – |
No examples provided.
remove_custom_domain Disconnect my domain ~45
Disconnect the custom domain, so the page is served from its kulhad.co address again. Anything printed with the old domain on it stops working, so confirm with the creator first.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | yes | – |
| instructions | string | yes | – |
| status | string | yes | none, pending or active |
| target | string | yes | What the DNS record has to point at. |
No examples provided.
remove_upi_id Remove a UPI ID ~61
Remove a UPI ID from the account. The last one, and the only active one, cannot be removed. This cannot be undone, and past supports lose the link to it; switching it off instead keeps it.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| removed | boolean | yes | – |
No examples provided.
reply_to_supporter Reply to a supporter ~102
Write or replace the thank-you beside one supporter, up to 280 characters; links and flagged words are refused. It shows on the creator's page once the supporter is approved, and on the supporter's own receipt link in any case. Replaces the previous reply with no history and cannot be blanked. Does not approve anyone and sends nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| reply | string | yes | Shown publicly beside them on the page. |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| status | string | yes | – |
No examples provided.
send_test_alert Send a test alert to my stream overlay ~61
Fire a test alert so the creator can see where it lands in OBS while setting up. It is not a real support: nothing is recorded, no goal moves and nobody is thanked. The overlay picks it up within about five seconds and it disappears after six.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| sent | boolean | yes | – |
| showsForSeconds | number | yes | – |
No examples provided.
set_active_goal Choose which goal the page shows ~72
Make one goal the one shown on the page, or turn the current one off. The page shows a single goal at a time, so choosing one puts the others away without deleting anything. Reversible.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | False turns this goal off and shows none. |
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
set_custom_domain Connect my own domain ~112
Record the domain the creator wants in front of their page and return the DNS record to add. Part of Premium. Replaces any domain already recorded, including a working one, which then stops serving until verify_custom_domain passes again, so confirm with the creator if a domain is already active. This does not touch DNS or make the domain work: the creator adds the record at their registrar, then verify_custom_domain checks it.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | For example: priya.in or support.priya.in |
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | yes | – |
| instructions | string | yes | – |
| status | string | yes | none, pending or active |
| target | string | yes | What the DNS record has to point at. |
No examples provided.
set_default_upi_id Choose which UPI ID is quoted first ~55
Make one active UPI ID the one supporters are shown first. The others stay on the account. This does not switch an ID on: an inactive ID made default is never quoted.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| saved | boolean | yes | – |
No examples provided.
set_saved_replies Set my saved replies ~76
Replace the list of ready-made thank-you replies the creator picks from when approving a supporter. Part of Premium. At most 7, each up to 280 characters; blank replies and any containing a link or a flagged word are dropped and counted. Passing an empty list removes all of them.
| Name | Type | Req | Description |
|---|---|---|---|
| replies | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | yes | – |
| saved | boolean | yes | – |
| skipped | number | yes | – |
No examples provided.
set_upi_rotation Turn taking turns on or off ~44
When on, active UPI IDs take turns being quoted so support spreads across them instead of landing in one account. Part of Premium.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| rotation | boolean | yes | – |
No examples provided.
start_signup Start setting up a page ~103
Get a link that opens Kulhad sign-up with a page name already filled in. Hand it to the person setting up the page; they finish it themselves in a browser. This does not create an account and cannot. It marks the name as taken for check_username_available for fifteen minutes; it does not stop anyone signing up with that name directly. Nothing is sent.
| Name | Type | Req | Description |
|---|---|---|---|
| username | string | yes | The page name to reserve and prefill. For example: priya |
| Name | Type | Req | Description |
|---|---|---|---|
| heldForMinutes | number | yes | – |
| nextSteps | array | yes | – |
| url | string | yes | Open this in a browser to finish signing up. |
| username | string | yes | – |
No examples provided.
update_goal Change a goal ~149
Change a goal's title, target, description, deadline or impact tiers. Only the fields you pass change, and each replaces the old value; impact replaces the whole list. Renaming changes the goal's web address, and the old address stops working with no redirect. Changing the target does not re-check whether the goal is complete.
| Name | Type | Req | Description |
|---|---|---|---|
| deadline | – | – | As YYYY-MM-DD. Null clears it. A goal does not stop at its deadline. |
| description | string | – | – |
| id | integer | yes | – |
| impact | array | – | What each amount pays for, shown on the goal. Premium. |
| targetAmount | integer | – | In whole rupees. |
| title | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | The one currently shown on the page. |
| deadline | – | yes | – |
| description | – | yes | – |
| filledAt | – | yes | When it reached its target. |
| id | number | yes | – |
| impact | array | yes | What each amount pays for. Premium. |
| percent | number | yes | – |
| raisedAmount | number | yes | – |
| raisedFormatted | string | yes | – |
| slug | string | yes | – |
| supportsCount | number | yes | – |
| targetAmount | number | yes | – |
| targetFormatted | string | yes | – |
| title | string | yes | – |
| updates | array | yes | – |
| url | string | yes | – |
No examples provided.
update_page_appearance Change how my page looks ~288
Change the page theme and the announcement banner across the top of it. Page themes, a custom theme colour (shown only when the theme is "custom"), your own banner colour, hiding the Kulhad badge, and a Google Analytics measurement ID are Premium. The measurement ID is stored as a page setting; Kulhad itself does not contact Google. Each value passed replaces the current one. Writes to the creator's own Kulhad account only.
| Name | Type | Req | Description |
|---|---|---|---|
| badgeHidden | boolean | – | Hide the "Powered by kulhad" badge. Premium. |
| gaMeasurementId | string | – | A Google Analytics ID like G-XXXXXXXXXX. Premium. Empty string clears it. |
| occasionColor | string | – | The banner colour. "own" uses occasionColorHex and is Premium. |
| occasionColorHex | string | – | The banner colour when occasionColor is "own", as a six-digit code starting with a hash. Empty string clears it. |
| occasionText | string | – | The banner text. Empty string clears it. |
| occasionUntil | – | – | The last day the banner shows, as YYYY-MM-DD. It shows through the whole of that day, India time. Null or an empty string removes the end date. |
| theme | string | – | Premium. |
| themeColor | string | – | A six-digit colour code starting with a hash, for the custom theme. An empty string clears it. |
| Name | Type | Req | Description |
|---|---|---|---|
| dropped | array | yes | – |
| saved | boolean | yes | – |
| url | string | yes | – |
No examples provided.
update_page_behaviour Change how my page behaves ~371
Change what the page does: whether new supporters go up without approval, whether people may give without a name, whether the supporter count and total show, the three suggested amounts and their labels, the headline on the pay card, the note supporters see after paying, when stream alerts fire, and whether voice messages are allowed (Premium). Passing amounts replaces all three. A label or headline that fails the word filter is blanked. Affects future supports only. Writes to the creator's own Kulhad account only.
| Name | Type | Req | Description |
|---|---|---|---|
| allowAnonymous | boolean | – | Let people give without leaving a name. |
| amountStyle | string | – | Which set of suggested amounts the page offers. |
| amounts | array | – | The three suggested amounts and what each is for. |
| autoPublish | boolean | – | Put a supporter on the page as soon as they mark a payment as sent, without waiting for approval. |
| cardHeadline | string | – | The line above the name on share cards. |
| counterQrEnabled | boolean | – | Offer the printable counter QR, which carries no amount and no message. |
| showSupporterCount | boolean | – | Show how many people have given. |
| showTotalRaised | boolean | – | Show the total amount received. |
| streamAlertOn | string | – | When the stream alert overlay fires. "approved" waits until you have looked at a support, which is how every other surface behaves. "claimed" fires as soon as someone marks a payment as sent, which i… |
| thankYouNote | string | – | Shown to a supporter after they pay. |
| voiceBlessingsEnabled | boolean | – | Let supporters record a short voice message. Premium. |
| Name | Type | Req | Description |
|---|---|---|---|
| dropped | array | yes | – |
| saved | boolean | yes | – |
| url | string | yes | – |
No examples provided.
update_profile Change my page details ~290
Change the creator's name, bio, page address, kind of page (person or organisation), page language, dashboard language, and the links on the page. Only the fields you pass change. Links replace the whole list, so pass every link that should stay. The bio keeps bold, italic, links and line breaks and is cut at 280 characters. Changing the page address stops the old kulhad.co address working at once, with no redirect: printed QR codes, embeds and OBS overlay links break, and the old name is free for anyone to take. Not allowed while a custom domain is active. Writes to the creator's own Kulhad account only.
| Name | Type | Req | Description |
|---|---|---|---|
| bio | string | – | A short introduction. Bold, italic, links and line breaks are kept, everything else is stripped, and it is cut at 280 characters. |
| kind | string | – | – |
| name | string | – | The name shown on the page. |
| pageLanguage | string | – | The language the public page is written in. |
| socials | array | – | Replaces the whole list. Pass an empty array to remove every link. |
| uiLanguage | string | – | The creator dashboard language. |
| username | string | – | The page address, as in kulhad.co/priya. The old address stops working immediately with no redirect, and the old name becomes free. Cannot be changed while a custom domain is active. |
| Name | Type | Req | Description |
|---|---|---|---|
| dropped | array | yes | – |
| saved | boolean | yes | – |
| url | string | yes | – |
No examples provided.
update_seo Change how my page appears in search ~96
Set the title (up to 60 characters) and description (up to 160) in the page's HTML head, which search engines and link previews read. Part of Premium. A blank value goes back to the text Kulhad generates. This does not set an image and does not contact any search engine; it only changes what the page serves.
| Name | Type | Req | Description |
|---|---|---|---|
| seoDescription | string | – | – |
| seoTitle | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| dropped | array | yes | – |
| saved | boolean | yes | – |
| url | string | yes | – |
No examples provided.
update_upi_id Change a UPI ID ~133
Change the address or label of a UPI ID, switch it on or off, or mark the one-rupee test done. Changing the address clears the test, and from then on the new address is what supporters are quoted and what past supports display. At least one ID has to stay active. Switching off the default leaves the lowest active ID quoted.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | – |
| id | integer | yes | – |
| label | string | – | – |
| testDone | boolean | – | Only set this true when the creator says they saw the rupee arrive. |
| vpa | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| id | number | yes | – |
| saved | boolean | yes | – |
No examples provided.
verify_custom_domain Check my domain is pointing here ~82
Look the domain up in public DNS and, if it points at Kulhad, switch the page to it; kulhad.co/<name> then redirects there. Part of Premium. Clears the same domain from any other account's unverified claim. Fails until the record has propagated, which is normal for the first few minutes.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | yes | – |
| instructions | string | yes | – |
| status | string | yes | none, pending or active |
| target | string | yes | What the DNS record has to point at. |
No examples provided.
How do I install the Kulhad MCP server?
Kulhad is a hosted endpoint at https://kulhad.co/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.
remote · kulhad.co
claude mcp add --transport http co-kulhad-kulhad 'https://kulhad.co/mcp'
What is the Kulhad MCP server?
Kulhad is an MCP server listed in the public MCP registry as co.kulhad/kulhad. Run a UPI creator support page from chat: supporters, goals, page, share assets. No money moves. This page covers its hosted endpoint (https://kulhad.co/mcp).
Is the Kulhad MCP server safe to use?
Kulhad scores 77 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 Kulhad MCP server expose?
Kulhad exposes 44 tools: check_username_available, start_signup, get_my_profile, get_page_settings, update_profile, and 39 more. Their descriptions and schemas cost roughly 4,213 tokens of context every time the server is loaded.
Does the Kulhad MCP server require authentication?
No. We connected to Kulhad without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Kulhad MCP server still maintained?
Kulhad is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.