# MCP: pull

Source: <https://telegafirst.com/docs/mcp-pull>
Locale: ru
releaseGitSha: 0bb11ef116e17ec64c802d5476eaff442e53d252
sourceContentDigest: 3bc8fee483266c0e037d98f305659ff95c5a97ca6c4cdae74a6c218781ddf378
Version: 9

# MCP: pull

Определения инструментов. Обновляйте tools/list после изменения прав. required\_scopes: ALL.

## export\_form\_submissions\_normalized

Export one form's submissions as a FLAT table — one row per submission, one column per answer field, headers in alphabetical order — so you never have to unpick raw JSON. Columns are \`seq\_num\`, \`created\_at\` (in the business's own timezone), \`status\`, \`linked\_user\_seq\_num\`, \`channel\`, then every field name that form has ever collected. Returns an \`export\_id\`; poll the exports endpoint for the download link (it is a temporary signed URL). One export runs at a time per key. This file DOES contain the answers themselves — it is the sanctioned way to hand the owner their own data, so tell them where it came from and do not paste its contents back into the conversation.

Scopes (ALL): \["pull:form\_submissions"]. Risk: "write".

[Вход, результат и права](https://telegafirst.com/docs/mcp-tool-export-form-submissions-normalized)

## get\_form\_submission

Read ONE submission by its own \`seq\_num\` (the id you pass to get and to \`set\_form\_submission\_handled\`), not the form number or public code. Same fields as \`pull\_form\_submissions\`, and the same rule about the answers: 🔴 \`payload\` is returned only with \`include: "full\_payload"\`, and that opt-in writes an audit row naming the api key, the form and the moment. A submission number that belongs to another account simply does not exist here. 0-cost read.

Scopes (ALL): \["pull:form\_submissions"]. Risk: "read".

[Вход, результат и права](https://telegafirst.com/docs/mcp-tool-get-form-submission)

## pull\_form\_submissions

List the submissions this business's own hosted forms collected, newest first. Returns the submission own \`seq\_num\` (the id you pass to get and to \`set\_form\_submission\_handled\`), its separate public \`submission\_code\`, \`created\_at\`, \`status\` (\`anonymous\` = the visitor has not been matched to a messenger user yet, \`linked\` = they have), \`form\_seq\_num\` with the form title as it was at the time, and — once linked — \`linked\_user\_seq\_num\` and \`channel\`. Filter by \`form\_seq\_num\` (the number \`site\_form\_declare\` returned), \`status\` and a date range; page with the opaque \`cursor\` from the previous answer. 🔴 The ANSWERS THEMSELVES are not included: what a visitor typed is personal data, so \`payload\` comes back only if you pass \`include: "full\_payload"\`, and that opt-in is recorded in the account's audit trail. Do not pass it to count leads or to check whether a form works — this call already tells you that. Pass it only when the owner asked you to read the actual answers.

Scopes (ALL): \["pull:form\_submissions"]. Risk: "read".

[Вход, результат и права](https://telegafirst.com/docs/mcp-tool-pull-form-submissions)

## query\_form\_submission\_segment

Turn form answers into an AUDIENCE: given a form and one or more \`(key, value)\` pairs the visitor answered, get back \`user\_seq\_nums\` — the per-tenant seq\_num of the users who answered that way — plus \`segment\_selection\`, an entry you can drop UNCHANGED into the \`include\` or \`exclude\` list of a broadcast's segment. All the pairs must hold together (AND). There is no \`or\` and no \`not\`, and none is needed: for "A or B" call twice and put both results in \`include\` (that list is a union); for "A but not B" put the second result in \`exclude\`. 🔴 This call never returns what anyone wrote — only WHO wrote it. \`truncated: true\` means the account's 5000-recipient cap cut the list short, so narrow the pairs rather than sending to a partial audience.

Scopes (ALL): \["pull:form\_submissions"]. Risk: "read".

[Вход, результат и права](https://telegafirst.com/docs/mcp-tool-query-form-submission-segment)
