mcpField
S
sorted

sorted

github.com/glebis其他401147 次安装1 天前更新
代码仓库

关于 sorted

sorted 是面向自由职业者的浏览器自动化技能,可通过 getSorted.de 管理发票、费用和德国税务报告。它使用真实的 Chrome Beta 会话,支持创建发票、下载 PDF 及预览或提交税务报告;部分操作受套餐限制。

主要功能

  1. 01创建、列出和下载发票
  2. 02在套餐支持时通过邮件发送发票
  3. 03添加并跟踪费用
  4. 04查看税务义务和截止日期
  5. 05预览或提交税务报告

适用场景

  1. 01为客户创建发票
  2. 02将发票下载为 PDF
  3. 03在 Sorted 记录费用
  4. 04查看或提交德国税务报告

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/glebis/claude-skills --skill sorted

安装后在 Claude Code 中输入/sorted确认已加载。

详细介绍

Sorted — 自由职业者税务与发票自动化

通过真实的 Chrome Beta 浏览器自动操作 getSorted.de,用于开具发票、跟踪支出以及提交德国税务申报。

前提条件

  • Chrome Beta,并使用 --remote-debugging-port=9222(使用 /real-browser 启动流程)
  • Google 账号会话已保存在 ~/.chrome-beta-profile
  • 已安装 agent-browser CLI

命令

invoice create

在 Sorted 上创建新发票。

必需参数: 客户名称、金额
可选参数: 小时数、费率、描述、到期日、服务日期、客户类型(企业/个人)

invoice download <invoice-number>

从 Sorted 下载格式规范的 PDF(而非浏览器打印版)。

invoice send <invoice-number> --email <email>

直接通过 Sorted 发送发票邮件(仅限付费套餐)。免费套餐会下载 PDF,并通过 Telegram 发送。

invoice list

列出所有发票及其状态(已付款/未付款)。

expense add

添加一笔支出。

tax status

显示当前税务义务、截止日期和逾期申报。

tax preview <report-type> <period>

在提交前预览税务申报。

tax submit <report-type> <period>

通过 ELSTER 向 Finanzamt 提交税务申报(需要付费套餐)。

Sorted 导航

应用网址:https://app.getsorted.de/

区域侧边栏链接用途
控制面板Sorted(徽标)概览:应缴税款、收入、支出
税务Taxes税务申报、截止日期、提交记录
收入Income发票列表、创建/编辑发票
支出Expenses支出跟踪、收据
税务顾问Tax consultant顾问对接
个人详情Profile → Personal details自由职业者信息、Steuernummer
银行账户Profile → Bank accounts (Beta)已关联的银行
订阅Profile → Subscription套餐管理
导入Profile → Import your data批量导入数据
设置Profile → Settings应用偏好设置

税务申报类型

申报德语名称频率说明
增值税预申报Umsatzsteuer-Voranmeldung (UStVA)每季度发票中收取的增值税
欧盟汇总申报Zusammenfassende Meldung (ZM)每季度来自欧盟客户的收入
年度申报EÜR + Einkommensteuererklärung每年盈亏 + 所得税

创建发票流程

浏览器自动化步骤:
  1. 导航: Income → 点击 Add → Create invoice
  2. 设置客户: 点击发票预览中的 Client details 区域
    • 搜索现有客户,或点击 Add new client
    • 选择 Business 或 Private person
    • 填写:姓名、VAT/TIN、街道、城市、邮编、国家(自动补全下拉菜单——输入后点击匹配项)、电子邮件(可选)
    • 在对话框中点击 Save
  3. 设置发票日期: 点击“Invoice date”旁的日期(默认为今天)
  4. 设置服务日期(必填): 点击发票日期右侧标为“Service date”的空白区域
    • 这是一个日期范围选择器——先选择开始日期,再选择结束日期
    • 如果服务在同一天完成,请对同一日期点击两次
    • 未设置服务日期时,Save 会静默失败——该字段会以红色显示“Required”
    • 可点击元素的 class 为 clickable,位于发票预览中的约 x:734 y:413 处
    • 如果快照中未显示该元素,请使用 JS:查找文本为“Service dateRequired”的 div 并点击
  5. 设置到期日: 点击“Due date”下方的“Select date”→ 在日历中选择日期
  6. 添加项目: 点击 Add a line
    • 字段:描述(文本)、数量(数字)、单位下拉菜单(h/pcs 等)、费率(数字)
    • 点击已折叠的值即可重新编辑
  7. 增值税: Kleinunternehmer 账户会自动设为 0%。备注中会显示“Service not taxable in Germany”
  8. 保存: 点击 Save 按钮。成功后,标题会从“Add invoice”变为“Edit invoice”
注意事项
  • 服务日期为必填项,但很容易忽略——只有在尝试保存时才会提示
  • **德式数字格式:**句点是千位分隔符(1.000 = 一千),逗号表示小数
  • **已折叠的字段:**保存后,明细项字段会折叠为仅显示内容。点击显示的值即可重新打开可编辑字段
  • **发票编号:**按顺序自动生成(例如,2025-03-21)。点击即可编辑

发票 PDF 下载流程

重要:请勿使用 Chrome CDP Page.printToPDF——它会截取整个页面,包括侧边栏和设置面板。请始终使用 Sorted 的原生 PDF。

步骤:
  1. 打开发票(从 Income 列表中点击,或创建后导航至该发票)
  2. 点击 Save and send 按钮(右上角的青绿色按钮)
  3. 此时会出现 “Email invoice” 对话框,其中包含:
    • To 字段(电子邮件)
    • Subject 字段(自动填充)
    • Message 文本框
    • 底部的 Attachments 区域,显示 PDF 文件名
  4. 点击 PDF 链接(例如,ALL3 DOO BELGRADE-2025-03-21-20260506.pdf)
    • 这是一个带有 cursor:pointer 和 onclick 的 generic 元素
    • 文本符合以下模式:{CLIENT_NAME}-{INVOICE_NUMBER}-{DATE}.pdf
  5. PDF 会下载到 ~/Downloads/
  6. 关闭对话框(点击 Close 或 ×)
发送电子邮件(付费计划)

在付费计划中,“Email invoice” 对话框功能完整:

  1. 在 To 字段中填写客户电子邮件(@e49)
  2. 如有需要,编辑 Subject(默认填充为 “Gleb Kalinin sent you an invoice (#INVOICE-NUMBER)”)
  3. 在文本框中填写 Message
  4. 切换 “Send a copy to my email” 复选框(默认已勾选)
  5. 点击 Email invoice 按钮(@e15)发送

在免费计划中,对话框会显示 “Sending invoices by email is not available in your plan” 和一个 “Change my plan” 链接。无论如何,PDF 仍可下载。

备用方式:通过 Telegram 发送(免费计划)

如果无法发送电子邮件,请下载 PDF 并通过 Telethon 发送(见下方的“下载后发送发票”一节)。

PDF 文件名模式
{CLIENT_NAME}-{INVOICE_NUMBER}-{YYYYMMDD}.pdf

示例:ALL3 DOO BELGRADE-2025-03-21-20260506.pdf

客户管理

现有客户会保存下来,供重复使用。创建发票时:

  • 客户选择器会显示所有已保存的客户
  • 在搜索框中按名称搜索
  • 点击各名称旁边的小按钮,即可编辑或删除客户
客户字段(企业)
  • 企业名称(必填)
  • VAT number / TIN(可选)
  • 街道和门牌号
  • 城市
  • 邮政编码
  • 国家(自动补全——输入后点击匹配项)
  • 电子邮件
客户字段(个人)
  • 名字、姓氏
  • 地址字段与企业相同

下载后发送发票

下载 PDF 后,通过 Telethon 使用 Telegram 发送:

from telethon.sync import TelegramClient
import json
from pathlib import Path

config = json.loads((Path.home() / '.telegram_dl' / 'config.json').read_text())
session = str(Path.home() / '.telegram_dl' / 'user')

with TelegramClient(session, config['api_id'], config['api_hash']) as client:
    client.send_file("username", "/path/to/invoice.pdf", caption="message")

Gleb 的 Sorted 账户详情

  • **状态:**Kleinunternehmer(不收取增值税)
  • **Finanzamt:**Berlin - Wedding
  • **VAT-ID:**DE369692682
  • **税号:**2337201265
  • **银行:**Revolut Bank UAB, Zweigniederlassung
  • **IBAN:**DE38 1001 0178 8157 1777 30
  • **BIC/SWIFT:**REVODEB2
  • **计划:**免费(可开具发票;提交税务申报需升级)

浏览器会话设置

始终使用 /real-browser 技能的启动流程。每次运行都应使用唯一的会话名称:

SESSION=$(LC_ALL=C tr -dc 'a-z0-9' < /dev/urandom | head -c 6)
agent-browser --cdp 9222 --session "$SESSION" open "https://app.getsorted.de/"

Google 登录状态会持久保存——无需每次重新验证。

评论

支持 Markdown