Mint generative on-chain punks on Ethereum for 0.002 ETH. Unsigned txs only, no keys.
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.
Unsigned Seaport fulfillAdvancedOrder tx to buy a listing or sell into an offer (tokenId required for a collection offer), simulated, plus any approvals the fulfiller still needs.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http punks-generated https://punks-generated-eth.enspiration-eth.workers.dev/mcp
Unsigned Seaport fulfillAdvancedOrder tx to buy a listing or sell into an offer (tokenId required for a collection offer), simulated, plus any approvals the fulfiller still needs.
| Argument | Type | Description |
|---|---|---|
| tokenId | integer | |
| fulfiller* | string | |
| orderHash* | string |
{
"type": "object",
"required": [
"orderHash",
"fulfiller"
],
"properties": {
"tokenId": {
"type": "integer",
"minimum": 1
},
"fulfiller": {
"type": "string"
},
"orderHash": {
"type": "string"
}
}
}Unsigned Seaport cancel tx for one of your orders. Only the offerer can send it.
| Argument | Type | Description |
|---|---|---|
| orderHash* | string |
{
"type": "object",
"required": [
"orderHash"
],
"properties": {
"orderHash": {
"type": "string"
}
}
}Check a sent mint tx hash and return the token ids it minted.
| Argument | Type | Description |
|---|---|---|
| txHash* | string |
{
"type": "object",
"required": [
"txHash"
],
"properties": {
"txHash": {
"type": "string"
}
}
}ERC-8004 registration file for the owner's agent, using punk #id as its image and id.punks.generated.eth as its ENS name, plus the unsigned register tx for the owner to send.
| Argument | Type | Description |
|---|---|---|
| id* | integer | |
| mcp | string | |
| name | string | |
| description | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"mcp": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
}
}
}Live listings (cheapest first), offers incl. collection offers (highest first) and recent sales, for punk #id (with its traits) or the whole collection. Every order is re-checked on-chain; stale ones are skipped.
| Argument | Type | Description |
|---|---|---|
| id | integer |
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
}
}
}Price, supply and contract for punks.generated.eth.
No arguments.
{
"type": "object",
"properties": {}
}Owner, traits, seed, image, subname for a token id.
| Argument | Type | Description |
|---|---|---|
| id* | integer |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1
}
}
}Optional, after a mint: unsigned ERC-8004 Reputation Registry giveFeedback tx rating this agent 0 to 100 (tag1 starred). Only send it if your wallet owner agrees. Costs gas, no ETH goes to us.
| Argument | Type | Description |
|---|---|---|
| from | string | wallet that will send it (must not be the agent owner) |
| tag2 | string | what you rate, default mint |
| score* | integer |
{
"type": "object",
"required": [
"score"
],
"properties": {
"from": {
"type": "string",
"description": "wallet that will send it (must not be the agent owner)"
},
"tag2": {
"type": "string",
"description": "what you rate, default mint"
},
"score": {
"type": "integer",
"maximum": 100,
"minimum": 0
}
}
}Seaport 1.6 listing for punk #id at an ETH price: EIP-712 typed data for the owner to sign (free), plus the one-time setApprovalForAll tx to the Seaport conduit if missing. Then submit_order.
| Argument | Type | Description |
|---|---|---|
| id* | integer | |
| seller | string | |
| priceEth | string | e.g. "0.05" |
| priceWei | string | |
| expiresInSeconds | integer | default 7 days |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"seller": {
"type": "string"
},
"priceEth": {
"type": "string",
"description": "e.g. \"0.05\""
},
"priceWei": {
"type": "string"
},
"expiresInSeconds": {
"type": "integer",
"maximum": 31536000,
"minimum": 60,
"description": "default 7 days"
}
}
}Seaport 1.6 WETH offer on punk #id, or a collection-wide offer on any punk if id is omitted. Returns typed data to sign plus WETH wrap/approve txs if needed. Then submit_order.
| Argument | Type | Description |
|---|---|---|
| id | integer | omit for a collection offer |
| buyer* | string | |
| priceEth | string | |
| priceWei | string | |
| expiresInSeconds | integer |
{
"type": "object",
"required": [
"buyer"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "omit for a collection offer"
},
"buyer": {
"type": "string"
},
"priceEth": {
"type": "string"
},
"priceWei": {
"type": "string"
},
"expiresInSeconds": {
"type": "integer",
"maximum": 31536000,
"minimum": 60
}
}
}Unsigned mint(qty) transaction plus the x402 URL. The caller signs and sends it, and the punks go to the sending wallet (msg.sender). This server never holds keys or funds. mint(qty) mints to msg.sender. Gas: about 111k units for mint(1) (measured on mainnet), more for each extra punk; about 175k for a free claim. Always run estimateGas, gas price varies.
| Argument | Type | Description |
|---|---|---|
| qty* | integer | |
| from | string | optional: the wallet you will send from. Only copied into the tx for convenience; the punks always go to the actual sender. |
{
"type": "object",
"required": [
"qty"
],
"properties": {
"qty": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"from": {
"type": "string",
"description": "optional: the wallet you will send from. Only copied into the tx for convenience; the punks always go to the actual sender."
}
}
}Total price in wei for qty punks.
| Argument | Type | Description |
|---|---|---|
| qty* | integer |
{
"type": "object",
"required": [
"qty"
],
"properties": {
"qty": {
"type": "integer",
"maximum": 10,
"minimum": 1
}
}
}Resolve <id>.punks.generated.eth (or any ENS name) to address, avatar and url.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
}
}
}Publish a signed listing or offer. Verifies the signature (EOA or ERC-1271), ownership, conduit approval, WETH balance and allowance before storing it.
| Argument | Type | Description |
|---|---|---|
| order* | object | the order (OrderComponents) from list_punk / make_offer |
| signature* | string |
{
"type": "object",
"required": [
"order",
"signature"
],
"properties": {
"order": {
"type": "object",
"description": "the order (OrderComponents) from list_punk / make_offer"
},
"signature": {
"type": "string"
}
}
}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 1, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.