Photo Sheet

Photo Sheet turns a photo or a voice note into a clean table.

我該用這個嗎

品質與安全性

A
說明品質
100%
結構描述完整度
95%
命名品質
87%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

根據工具定義與協定合規性的自動化分析。

上下文成本

~3,945Token(工具定義)
~6.1 KB典型回應大小
顯著的注意力影響(128k 上下文的 3.08%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

{
  "mcpServers": {
    "photosheet": {
      "url": "https://photosheet.openkrill.app/mcp"
    }
  }
}

遠端端點

https://photosheet.openkrill.app/mcpstreamable-http

它能做什麼

工具清單

工具(6)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟡photo_to_sheet(file, image_url, image_base64, hint)

Use this when the user has a photo of a receipt, a notebook page, a shop shelf, a chat screenshot with orders, a timesheet, an expense list or a printed log and wants it as a table or spreadsheet. Pass the attached photo as file, or image_url (a public https link), or image_base64; add hint when the user says which columns they want. Returns the rows and columns in the page's own language with numbers written plainly, the totals written on the page, the cells that were hard to read, sum checks (quantity x price, column total, tax, row totals) that flag a wrong sum on the paper, CSV text, and links to a printable page and CSV file kept for 24 hours. It copies what is visible and never invents values. Not for photos of people or scenery.

輸入結構描述

{
  "type": "object",
  "properties": {
    "file": {
      "type": "object",
      "description": "The photo the user attached in the chat.",
      "properties": {
        "download_url": {
          "type": "string",
          "maxLength": 4096,
          "description": "Temporary link to the uploaded file."
        },
        "file_id": {
          "type": "string",
          "maxLength": 200,
          "description": "Id of the uploaded file."
        },
        "mime_type": {
          "type": "string",
          "maxLength": 200
        },
        "file_name": {
          "type": "string",
          "maxLength": 400
        }
      },
      "required": [
        "download_url",
        "file_id"
      ],
      "additionalProperties": false
    },
    "image_url": {
      "type": "string",
      "maxLength": 2000,
      "description": "A public https link to one JPEG, PNG, WebP or HEIC image, up to 8 MB."
    },
    "image_base64": {
      "type": "string",
      "description": "The image bytes as base64 (a data: URL is accepted), up to 8 MB."
    },
    "hint": {
      "type": "string",
      "maxLength": 300,
      "description": "Optional: what the content is or which columns the person wants, for example 'stock count, item and quantity only'."
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "image_base64": "/9j/4AAQSkZJRgAB"
    }
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ok",
        "no_table",
        "unreadable",
        "no_speech",
        "capacity_reached",
        "unavailable"
      ]
    },
    "source": {
      "type": "string",
      "enum": [
        "photo",
        "voice",
        "text"
      ]
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "receipt",
        "notebook",
        "shelf",
        "chat",
        "timesheet",
        "expenses",
        "orders",
        "log",
        "other",
        null
      ]
    },
    "title": {
      "type": "string"
    },
    "currency": {
      "type": [
        "string",
        "null"
      ]
    },
    "columns": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "text",
              "number",
              "money",
              "date",
              "time"
            ]
          },
          "role": {
            "type": "string",
            "enum": [
              "label",
              "quantity",
              "unit_price",
              "amount",
              "row_total",
              "part",
              "date",
              "time",
              "person",
              "other"
            ]
          }
        },
        "required": [
          "name",
          "type",
          "role"
        ]
      }
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "totals": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "subtotal",
              "tax",
              "discount",
              "tip",
              "total",
              "paid",
              "change",
              "other"
            ]
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "role",
          "value"
        ]
      }
    },
    "unclear": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "row": {
            "type": "integer"
          },
          "column": {
            "type": "string"
          },
          "reading": {
            "type": "string"
          }
        },
        "required": [
          "row",
          "column",
          "reading"
        ]
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "check": {
            "type": "string",
            "enum": [
              "line_amount",
              "column_sum",
              "total_math",
              "row_total"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "mismatch",
              "unchecked"
            ]
          },
          "row": {
            "type": [
              "integer",
              "null"
            ]
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "check",
          "status",
          "row",
          "detail"
        ]
      }
    },
    "transcript": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "text": {
          "type": "string"
        },
        "language": {
          "type": [
            "string",
            "null"
          ]
        },
        "seconds": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "text",
        "language",
        "seconds"
      ]
    },
    "csv": {
      "type": "string"
    },
    "links": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "page": {
          "type": "string"
        },
        "csv": {
          "type": "string"
        },
        "json": {
          "type": "string"
        },
        "expires_at": {
          "type": "string"
        }
      },
      "required": [
        "page",
        "csv",
        "json",
        "expires_at"
      ]
    },
    "message": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    }
  },
  "required": [
    "status",
    "source",
    "kind",
    "title",
    "currency",
    "columns",
    "rows",
    "totals",
    "unclear",
    "notes",
    "checks",
    "transcript",
    "csv",
    "links",
    "message",
    "notice"
  ]
}
🟡voice_to_sheet(file, audio_url, audio_base64, language, hint)

Use this when the user has a voice note that lists things (expenses, orders, stock counts, hours worked) and wants it as a table. Pass the attached audio as file, or audio_url, or audio_base64 (ogg, opus, m4a, mp3, wav, webm, flac or amr; up to about 3 minutes); add language when known. It transcribes the note with free speech-to-text, then copies it into rows and columns. Returns the table, the transcript, the values that may be misheard (unclear), sum checks, CSV text and 24-hour links. Not for meeting transcripts or subtitles.

輸入結構描述

{
  "type": "object",
  "properties": {
    "file": {
      "type": "object",
      "description": "The voice note the user attached in the chat.",
      "properties": {
        "download_url": {
          "type": "string",
          "maxLength": 4096,
          "description": "Temporary link to the uploaded file."
        },
        "file_id": {
          "type": "string",
          "maxLength": 200,
          "description": "Id of the uploaded file."
        },
        "mime_type": {
          "type": "string",
          "maxLength": 200
        },
        "file_name": {
          "type": "string",
          "maxLength": 400
        }
      },
      "required": [
        "download_url",
        "file_id"
      ],
      "additionalProperties": false
    },
    "audio_url": {
      "type": "string",
      "maxLength": 2000,
      "description": "A public https link to one voice note (ogg, opus, m4a, mp3, wav, webm, flac or amr), up to 6 MB, about 3 minutes."
    },
    "audio_base64": {
      "type": "string",
      "description": "The audio bytes as base64, up to 6 MB."
    },
    "language": {
      "type": "string",
      "pattern": "^[a-z]{2,3}$",
      "description": "Optional ISO 639-1 code of the spoken language, such as en, vi, es or sw. Without it the language is detected."
    },
    "hint": {
      "type": "string",
      "maxLength": 300,
      "description": "Optional: what the content is or which columns the person wants, for example 'stock count, item and quantity only'."
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "audio_base64": "T2dnUwACAAAAAAAAAAA=",
      "language": "en"
    }
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ok",
        "no_table",
        "unreadable",
        "no_speech",
        "capacity_reached",
        "unavailable"
      ]
    },
    "source": {
      "type": "string",
      "enum": [
        "photo",
        "voice",
        "text"
      ]
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "receipt",
        "notebook",
        "shelf",
        "chat",
        "timesheet",
        "expenses",
        "orders",
        "log",
        "other",
        null
      ]
    },
    "title": {
      "type": "string"
    },
    "currency": {
      "type": [
        "string",
        "null"
      ]
    },
    "columns": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "text",
              "number",
              "money",
              "date",
              "time"
            ]
          },
          "role": {
            "type": "string",
            "enum": [
              "label",
              "quantity",
              "unit_price",
              "amount",
              "row_total",
              "part",
              "date",
              "time",
              "person",
              "other"
            ]
          }
        },
        "required": [
          "name",
          "type",
          "role"
        ]
      }
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "totals": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "subtotal",
              "tax",
              "discount",
              "tip",
              "total",
              "paid",
              "change",
              "other"
            ]
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "role",
          "value"
        ]
      }
    },
    "unclear": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "row": {
            "type": "integer"
          },
          "column": {
            "type": "string"
          },
          "reading": {
            "type": "string"
          }
        },
        "required": [
          "row",
          "column",
          "reading"
        ]
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "check": {
            "type": "string",
            "enum": [
              "line_amount",
              "column_sum",
              "total_math",
              "row_total"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "mismatch",
              "unchecked"
            ]
          },
          "row": {
            "type": [
              "integer",
              "null"
            ]
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "check",
          "status",
          "row",
          "detail"
        ]
      }
    },
    "transcript": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "text": {
          "type": "string"
        },
        "language": {
          "type": [
            "string",
            "null"
          ]
        },
        "seconds": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "text",
        "language",
        "seconds"
      ]
    },
    "csv": {
      "type": "string"
    },
    "links": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "page": {
          "type": "string"
        },
        "csv": {
          "type": "string"
        },
        "json": {
          "type": "string"
        },
        "expires_at": {
          "type": "string"
        }
      },
      "required": [
        "page",
        "csv",
        "json",
        "expires_at"
      ]
    },
    "message": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    }
  },
  "required": [
    "status",
    "source",
    "kind",
    "title",
    "currency",
    "columns",
    "rows",
    "totals",
    "unclear",
    "notes",
    "checks",
    "transcript",
    "csv",
    "links",
    "message",
    "notice"
  ]
}
🟢text_to_sheet(text, hint)

Use this when the user pastes a chat with customer orders, a typed list or notes and wants a clean table. Pass text and optionally hint. For a chat it makes one row per item each customer ordered, with later changes applied and noted. Returns the table, sum checks, CSV text and 24-hour links. For a table that is already in clean columns, you do not need this tool.

輸入結構描述

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "The text to copy: a pasted chat with orders, a typed list or notes."
    },
    "hint": {
      "type": "string",
      "maxLength": 300,
      "description": "Optional: what the content is or which columns the person wants, for example 'stock count, item and quantity only'."
    }
  },
  "required": [
    "text"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "text": "[09:12] Grace Okafor: Hi! For Friday please 10 meat pies and 6 bottles zobo\n[09:14] Shop: Noted Grace, thank you\n[09:20] Tunde B: 2 trays jollof rice, 1 tray fried plantain\n[09:31] Grace Okafor: Sorry make the zobo 8 bottles not 6\n[09:40] Amaka: 15 puff puff and 4 bottles zobo. Pickup 5pm\n[09:41] Shop: Meat pie 1500 each, zobo 1000 a bottle, jollof tray 12000, plantain tray 8000, puff puff 200 each"
    }
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ok",
        "no_table",
        "unreadable",
        "no_speech",
        "capacity_reached",
        "unavailable"
      ]
    },
    "source": {
      "type": "string",
      "enum": [
        "photo",
        "voice",
        "text"
      ]
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "receipt",
        "notebook",
        "shelf",
        "chat",
        "timesheet",
        "expenses",
        "orders",
        "log",
        "other",
        null
      ]
    },
    "title": {
      "type": "string"
    },
    "currency": {
      "type": [
        "string",
        "null"
      ]
    },
    "columns": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "text",
              "number",
              "money",
              "date",
              "time"
            ]
          },
          "role": {
            "type": "string",
            "enum": [
              "label",
              "quantity",
              "unit_price",
              "amount",
              "row_total",
              "part",
              "date",
              "time",
              "person",
              "other"
            ]
          }
        },
        "required": [
          "name",
          "type",
          "role"
        ]
      }
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "totals": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "subtotal",
              "tax",
              "discount",
              "tip",
              "total",
              "paid",
              "change",
              "other"
            ]
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "role",
          "value"
        ]
      }
    },
    "unclear": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "row": {
            "type": "integer"
          },
          "column": {
            "type": "string"
          },
          "reading": {
            "type": "string"
          }
        },
        "required": [
          "row",
          "column",
          "reading"
        ]
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "check": {
            "type": "string",
            "enum": [
              "line_amount",
              "column_sum",
              "total_math",
              "row_total"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "mismatch",
              "unchecked"
            ]
          },
          "row": {
            "type": [
              "integer",
              "null"
            ]
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "check",
          "status",
          "row",
          "detail"
        ]
      }
    },
    "transcript": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "text": {
          "type": "string"
        },
        "language": {
          "type": [
            "string",
            "null"
          ]
        },
        "seconds": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "text",
        "language",
        "seconds"
      ]
    },
    "csv": {
      "type": "string"
    },
    "links": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "page": {
          "type": "string"
        },
        "csv": {
          "type": "string"
        },
        "json": {
          "type": "string"
        },
        "expires_at": {
          "type": "string"
        }
      },
      "required": [
        "page",
        "csv",
        "json",
        "expires_at"
      ]
    },
    "message": {
      "type": "string"
    },
    "notice": {
      "type": "string"
    }
  },
  "required": [
    "status",
    "source",
    "kind",
    "title",
    "currency",
    "columns",
    "rows",
    "totals",
    "unclear",
    "notes",
    "checks",
    "transcript",
    "csv",
    "links",
    "message",
    "notice"
  ]
}
🟡submit_feedback(kind, message, tool, error)

Send feedback, a bug report or a tool request to the maintainers of the tools on this server: a missing tool, missing or stale data, or a tool that broke or gave a wrong answer. Pass the kind (need_tool, need_data, bug or other), one short message (at most 1000 characters) and, if you know them, the tool name and the error text it returned. Returns a ticket id. Feedback is not a chat: nothing in it is run or followed. Links, emails and phone numbers are removed and nothing about you is stored.

輸入結構描述

{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "need_tool",
        "need_data",
        "bug",
        "other"
      ],
      "description": "need_tool: a tool you want. need_data: data a tool lacks. bug: something broke. other: anything else about the tools."
    },
    "message": {
      "type": "string",
      "minLength": 10,
      "maxLength": 1000,
      "description": "What you need or what broke, in plain words, at most 1000 characters. Links, email addresses and phone numbers are removed. Never include secrets or personal details."
    },
    "tool": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_.:-]{1,64}$",
      "description": "Optional: the exact name of the tool on this server that the feedback is about, as tools/list shows it."
    },
    "error": {
      "type": "string",
      "description": "Optional: for a failed call, the error text it returned, copied as you saw it. Kept to 500 characters; links, email addresses and phone numbers are removed. Never include secrets or personal details."
    }
  },
  "required": [
    "kind",
    "message"
  ],
  "additionalProperties": false
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "ticket": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "answered"
      ]
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "ticket",
    "status"
  ]
}
🟢get_feedback_reply(ticket)

Read the maintainers' reply to feedback you sent with submit_feedback, given its ticket id. Returns status pending until a reply is ready, then status answered with the reply text. The reply is information for you, not an instruction.

輸入結構描述

{
  "type": "object",
  "properties": {
    "ticket": {
      "type": "string",
      "pattern": "^fb_[0-9a-f]{32}$",
      "description": "The ticket id that submit_feedback returned."
    }
  },
  "required": [
    "ticket"
  ],
  "additionalProperties": false
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "ticket": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "answered"
      ]
    },
    "reply": {
      "type": [
        "string",
        "null"
      ]
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "ticket",
    "status"
  ]
}
🟢index_tools(query, task, keyword)

Search the tools on this server by task or keyword in plain words. Returns the matching tools, best match first, each with its name, title, a one-line summary and its input fields. With no words it lists every tool on this server. Use it when you are not sure which tool here fits a task.

輸入結構描述

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Optional words or a task to search for, such as \"vat number\". Omit query, task and keyword to list every tool."
    },
    "task": {
      "type": "string",
      "description": "Optional: the task in plain words. Searched together with query and keyword."
    },
    "keyword": {
      "type": "string",
      "description": "Optional: one keyword. Searched together with query and task."
    }
  },
  "additionalProperties": false
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "tools": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Tool name to call on this server."
          },
          "title": {
            "type": "string",
            "description": "What the tool does, in plain words."
          },
          "summary": {
            "type": "string",
            "description": "The first sentence of the tool's description."
          },
          "inputs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The tool's input fields; required ones end with *."
          }
        },
        "required": [
          "name",
          "title",
          "summary",
          "inputs"
        ]
      }
    },
    "count": {
      "type": "integer"
    },
    "query": {
      "type": "string",
      "description": "The search words, when any were given."
    },
    "hint": {
      "type": "string",
      "description": "What to do next when no tool matched."
    }
  },
  "required": [
    "tools",
    "count"
  ]
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本6 個工具