Senses for agents on live sites and media: read, see, hear, drive a flow, verify a claim.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Open a URL in a real browser, run up to 20 steps (60 seconds at most), and return what happened: a timeline, screenshots and the final text. This acts on the live site: clicks and form submits are real. Nothing persists between calls, and typed text is not logged. Steps: {do: goto|click|type|press|wait|waitFor|scrollIntoView|mark, testid? | role+name? | selector?, text?, key?, url?, ms?, label?}. Uses 5 perceptions. Free keys get a monthly allowance.
http(s) URL
screen to load it on (default desktop)
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http senses https://api.pentasor.com/mcp
Open a URL in a real browser, run up to 20 steps (60 seconds at most), and return what happened: a timeline, screenshots and the final text. This acts on the live site: clicks and form submits are real. Nothing persists between calls, and typed text is not logged. Steps: {do: goto|click|type|press|wait|waitFor|scrollIntoView|mark, testid? | role+name? | selector?, text?, key?, url?, ms?, label?}. Uses 5 perceptions. Free keys get a monthly allowance.
| Argument | Type | Description |
|---|---|---|
| view | string | screen to load it on (default desktop) |
| steps* | array | |
| target* | string | http(s) URL |
{
"type": "object",
"required": [
"target",
"steps"
],
"properties": {
"view": {
"enum": [
"desktop",
"mobile"
],
"type": "string",
"description": "screen to load it on (default desktop)"
},
"steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"do"
],
"properties": {
"do": {
"enum": [
"goto",
"click",
"type",
"press",
"wait",
"waitFor",
"scrollIntoView",
"mark"
],
"type": "string"
},
"ms": {
"type": "integer"
},
"key": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
},
"text": {
"type": "string"
},
"label": {
"type": "string"
},
"testid": {
"type": "string"
},
"selector": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 20
},
"target": {
"type": "string",
"description": "http(s) URL"
}
},
"additionalProperties": false
}Transcribe speech from an audio or video URL, up to 20 MB: full text, language and timed segments. Uses one perception per started minute of audio. Free keys get a monthly allowance of minutes.
| Argument | Type | Description |
|---|---|---|
| target* | string | http(s) URL of an audio or video file |
{
"type": "object",
"required": [
"target"
],
"properties": {
"target": {
"type": "string",
"description": "http(s) URL of an audio or video file"
}
},
"additionalProperties": false
}Health check with an explanation: is it up, how fast, its security headers, and an excerpt of what it says. Paid keys also get sight, or hearing for media. Its `ok` covers those readings only and does NOT check any claim about the content: use `verify` for that.
| Argument | Type | Description |
|---|---|---|
| intent | string | what it should do; recorded with the percept, not judged |
| target* | string | http(s) URL |
{
"type": "object",
"required": [
"target"
],
"properties": {
"intent": {
"type": "string",
"description": "what it should do; recorded with the percept, not judged"
},
"target": {
"type": "string",
"description": "http(s) URL"
}
},
"additionalProperties": false
}Read a URL as it is delivered: status, title, text and links, without running JavaScript. Works on every key. If `sparse` is true the page builds itself in the browser: use `see` instead.
| Argument | Type | Description |
|---|---|---|
| target* | string | http(s) URL |
{
"type": "object",
"required": [
"target"
],
"properties": {
"target": {
"type": "string",
"description": "http(s) URL"
}
},
"additionalProperties": false
}Load a URL in a real browser and return a screenshot you can look at plus the rendered text. For a video URL, returns frames from it. Free keys get a monthly allowance: call `senses` to see what is left.
| Argument | Type | Description |
|---|---|---|
| view | string | screen to load it on (default desktop) |
| target* | string | http(s) URL |
| full_page | boolean | capture the whole page, not just the first screen |
{
"type": "object",
"required": [
"target"
],
"properties": {
"view": {
"enum": [
"desktop",
"mobile"
],
"type": "string",
"description": "screen to load it on (default desktop)"
},
"target": {
"type": "string",
"description": "http(s) URL"
},
"full_page": {
"type": "boolean",
"description": "capture the whole page, not just the first screen"
}
},
"additionalProperties": false
}What this key can use right now: its plan, which tools are open, and how many perceptions are left this month. Free to call.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Check a claim about a live page. `must_contain`, `must_not_contain` and `expect_status` are checked exactly. A free-text `expectation` needs judgment: when Pentasor can't judge it, the verdict is `unverified` and you get the evidence (text, plus a screenshot on paid keys) to decide yourself. `pass` means everything asked was checked and held; `fail` means something checked did not.
| Argument | Type | Description |
|---|---|---|
| target* | string | http(s) URL |
| expectation | string | what should be true, in plain words |
| must_contain | array | text that must appear (ignores case) |
| expect_status | integer | exact HTTP status expected; otherwise any answer under 400 counts as reachable |
| must_not_contain | array | text that must not appear (ignores case) |
{
"type": "object",
"required": [
"target"
],
"properties": {
"target": {
"type": "string",
"description": "http(s) URL"
},
"expectation": {
"type": "string",
"description": "what should be true, in plain words"
},
"must_contain": {
"type": "array",
"items": {
"type": "string"
},
"description": "text that must appear (ignores case)"
},
"expect_status": {
"type": "integer",
"description": "exact HTTP status expected; otherwise any answer under 400 counts as reachable"
},
"must_not_contain": {
"type": "array",
"items": {
"type": "string"
},
"description": "text that must not appear (ignores case)"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 5, 2026.