@zythum02/fello-server 0.1.39 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/out/renderer/assets/{_baseUniq-BonfEMiF.js → _baseUniq-B2L-gQdU.js} +1 -1
- package/out/renderer/assets/_baseUniq-B2L-gQdU.js.br +0 -0
- package/out/renderer/assets/_baseUniq-B2L-gQdU.js.gz +0 -0
- package/out/renderer/assets/{arc-Do8LbeMR.js → arc-Dh0s2UpX.js} +1 -1
- package/out/renderer/assets/arc-Dh0s2UpX.js.br +0 -0
- package/out/renderer/assets/arc-Dh0s2UpX.js.gz +0 -0
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-B8pyh3AH.js → architectureDiagram-Q4EWVU46-CQ2ioqAL.js} +5 -5
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-CQ2ioqAL.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-CQ2ioqAL.js.gz +0 -0
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-DxehDaBQ.js → blockDiagram-DXYQGD6D-Wh0G1xzO.js} +6 -6
- package/out/renderer/assets/blockDiagram-DXYQGD6D-Wh0G1xzO.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-Wh0G1xzO.js.gz +0 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-BwVB2HtH.js → c4Diagram-AHTNJAMY-BYn4M8r3.js} +2 -2
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BYn4M8r3.js.br +0 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-BwVB2HtH.js.gz → c4Diagram-AHTNJAMY-BYn4M8r3.js.gz} +0 -0
- package/out/renderer/assets/{channel-DoK5PQCo.js → channel-BbsS770v.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-B5UbKm2i.js → chunk-4BX2VUAB-BqmuvYx4.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-Mp3JyPop.js → chunk-4TB4RGXK-CGWvo0MB.js} +5 -5
- package/out/renderer/assets/chunk-4TB4RGXK-CGWvo0MB.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-CGWvo0MB.js.gz +0 -0
- package/out/renderer/assets/{chunk-55IACEB6-BpQS-lsN.js → chunk-55IACEB6-B2F_rVhp.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BQEQxqzJ.js → chunk-EDXVE4YY-rv_Sxmdr.js} +1 -1
- package/out/renderer/assets/chunk-EDXVE4YY-rv_Sxmdr.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-rv_Sxmdr.js.gz +0 -0
- package/out/renderer/assets/{chunk-FMBD7UC4-dCqprN1e.js → chunk-FMBD7UC4-B5pWdaON.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-D19mZGkc.js → chunk-OYMX7WX6-CK7U7B55.js} +3 -3
- package/out/renderer/assets/chunk-OYMX7WX6-CK7U7B55.js.br +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-CK7U7B55.js.gz +0 -0
- package/out/renderer/assets/{chunk-QZHKN3VN-DzWTtEnO.js → chunk-QZHKN3VN-CEGxn157.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-BEBfdXkA.js → chunk-YZCP3GAM-CP9VxQ_4.js} +1 -1
- package/out/renderer/assets/chunk-YZCP3GAM-CP9VxQ_4.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-CP9VxQ_4.js.gz +0 -0
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-BosKSo4l.js → classDiagram-6PBFFD2Q-DDq47uie.js} +6 -6
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-BosKSo4l.js → classDiagram-v2-HSJHXN6E-DDq47uie.js} +6 -6
- package/out/renderer/assets/{clone-C281XDWZ.js → clone-D_yz9tHs.js} +1 -1
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-6SeriN8Z.js → cose-bilkent-S5V4N54A-4f3CSmy0.js} +1 -1
- package/out/renderer/assets/cose-bilkent-S5V4N54A-4f3CSmy0.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-4f3CSmy0.js.gz +0 -0
- package/out/renderer/assets/{dagre-KV5264BT-gXq994RD.js → dagre-KV5264BT-CUE2rJbD.js} +6 -6
- package/out/renderer/assets/dagre-KV5264BT-CUE2rJbD.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-CUE2rJbD.js.gz +0 -0
- package/out/renderer/assets/{diagram-5BDNPKRD-GOebOMWt.js → diagram-5BDNPKRD-pp0PcxKz.js} +6 -6
- package/out/renderer/assets/diagram-5BDNPKRD-pp0PcxKz.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-pp0PcxKz.js.gz +0 -0
- package/out/renderer/assets/{diagram-G4DWMVQ6-BkQmAuCz.js → diagram-G4DWMVQ6-C-riu5J4.js} +6 -6
- package/out/renderer/assets/diagram-G4DWMVQ6-C-riu5J4.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-C-riu5J4.js.gz +0 -0
- package/out/renderer/assets/{diagram-MMDJMWI5-Q9B0Tkq3.js → diagram-MMDJMWI5-qa5mZzds.js} +5 -5
- package/out/renderer/assets/diagram-MMDJMWI5-qa5mZzds.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-qa5mZzds.js.gz +0 -0
- package/out/renderer/assets/{diagram-TYMM5635-5wNVFKxe.js → diagram-TYMM5635-BJb8gvcB.js} +5 -5
- package/out/renderer/assets/diagram-TYMM5635-BJb8gvcB.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-BJb8gvcB.js.gz +0 -0
- package/out/renderer/assets/docx_parser_bg-B5rV91hd.wasm +0 -0
- package/out/renderer/assets/{erDiagram-SMLLAGMA-DRxQnVgW.js → erDiagram-SMLLAGMA-BImpezHs.js} +4 -4
- package/out/renderer/assets/erDiagram-SMLLAGMA-BImpezHs.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-BImpezHs.js.gz +0 -0
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-3uIpRmli.js → flowDiagram-DWJPFMVM-BGPw25aw.js} +6 -6
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BGPw25aw.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BGPw25aw.js.gz +0 -0
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-CFxauQFp.js → ganttDiagram-T4ZO3ILL-DcKLeP7M.js} +2 -2
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-DcKLeP7M.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-DcKLeP7M.js.gz +0 -0
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-CDBCF75U.js → gitGraphDiagram-UUTBAWPF-BQE3VROE.js} +6 -6
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BQE3VROE.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BQE3VROE.js.gz +0 -0
- package/out/renderer/assets/{graph-B77t0Iut.js → graph-BpsL6VlK.js} +2 -2
- package/out/renderer/assets/graph-BpsL6VlK.js.br +0 -0
- package/out/renderer/assets/graph-BpsL6VlK.js.gz +0 -0
- package/out/renderer/assets/{highlighted-body-OFNGDK62-BOhs9DFu.js → highlighted-body-OFNGDK62-BKJZddky.js} +1 -1
- package/out/renderer/assets/index-C-1Mla-o.css +6729 -0
- package/out/renderer/assets/index-C-1Mla-o.css.br +0 -0
- package/out/renderer/assets/index-C-1Mla-o.css.gz +0 -0
- package/out/renderer/assets/{index-l_WeGi7a.js → index-Dd5g6jOl.js} +67828 -26949
- package/out/renderer/assets/index-Dd5g6jOl.js.br +0 -0
- package/out/renderer/assets/index-Dd5g6jOl.js.gz +0 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-C3TJqapp.js → infoDiagram-42DDH7IO-BfDiSuRt.js} +4 -4
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-C59I-VqG.js → ishikawaDiagram-UXIWVN3A-D3NlGVXH.js} +1 -1
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3NlGVXH.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3NlGVXH.js.gz +0 -0
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-B6jawzfM.js → journeyDiagram-VCZTEJTY-DqeLAWW-.js} +4 -4
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-DqeLAWW-.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-DqeLAWW-.js.gz +0 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-BCXhVxbs.js → kanban-definition-6JOO6SKY-C25BBRvk.js} +2 -2
- package/out/renderer/assets/kanban-definition-6JOO6SKY-C25BBRvk.js.br +0 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-BCXhVxbs.js.gz → kanban-definition-6JOO6SKY-C25BBRvk.js.gz} +0 -0
- package/out/renderer/assets/{layout-zx9noErc.js → layout-DtW-aq94.js} +4 -4
- package/out/renderer/assets/layout-DtW-aq94.js.br +0 -0
- package/out/renderer/assets/layout-DtW-aq94.js.gz +0 -0
- package/out/renderer/assets/{linear-Bo25ELwI.js → linear-rNBYTEYz.js} +1 -1
- package/out/renderer/assets/linear-rNBYTEYz.js.br +0 -0
- package/out/renderer/assets/linear-rNBYTEYz.js.gz +0 -0
- package/out/renderer/assets/mathjax-stix2-M8xawHNZ.js +15 -0
- package/out/renderer/assets/mathjax-stix2-M8xawHNZ.js.br +0 -0
- package/out/renderer/assets/mathjax-stix2-M8xawHNZ.js.gz +0 -0
- package/out/renderer/assets/{min-eGRLXD6u.js → min-MG_Ci7_B.js} +2 -2
- package/out/renderer/assets/min-MG_Ci7_B.js.br +0 -0
- package/out/renderer/assets/min-MG_Ci7_B.js.gz +0 -0
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-PUpW_gKO.js → mindmap-definition-QFDTVHPH-C67ROQav.js} +3 -3
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-C67ROQav.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-C67ROQav.js.gz +0 -0
- package/out/renderer/assets/{pdf-worker-wrapper-Do-ikGHl.js → pdf-worker-wrapper-D9W0fDhT.js} +6514 -5934
- package/out/renderer/assets/pdf-worker-wrapper-D9W0fDhT.js.br +0 -0
- package/out/renderer/assets/pdf-worker-wrapper-D9W0fDhT.js.gz +0 -0
- package/out/renderer/assets/{pieDiagram-DEJITSTG-BrSaX9YD.js → pieDiagram-DEJITSTG-DE1aBCQW.js} +6 -6
- package/out/renderer/assets/pieDiagram-DEJITSTG-DE1aBCQW.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-DE1aBCQW.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-BL-l9r39.js +4 -0
- package/out/renderer/assets/pierre-dark-BL-l9r39.js.br +0 -0
- package/out/renderer/assets/pierre-dark-BL-l9r39.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-protanopia-deuteranopia-BBjGuJQU.js +4 -0
- package/out/renderer/assets/pierre-dark-protanopia-deuteranopia-BBjGuJQU.js.br +0 -0
- package/out/renderer/assets/pierre-dark-protanopia-deuteranopia-BBjGuJQU.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-soft-B6TBhICr.js +4 -0
- package/out/renderer/assets/pierre-dark-soft-B6TBhICr.js.br +0 -0
- package/out/renderer/assets/pierre-dark-soft-B6TBhICr.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-tritanopia-f-j_EX9A.js +4 -0
- package/out/renderer/assets/pierre-dark-tritanopia-f-j_EX9A.js.br +0 -0
- package/out/renderer/assets/pierre-dark-tritanopia-f-j_EX9A.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-vibrant-yElMGqZN.js +4 -0
- package/out/renderer/assets/pierre-dark-vibrant-yElMGqZN.js.br +0 -0
- package/out/renderer/assets/pierre-dark-vibrant-yElMGqZN.js.gz +0 -0
- package/out/renderer/assets/pierre-light-BUzWTcjO.js +4 -0
- package/out/renderer/assets/pierre-light-BUzWTcjO.js.br +0 -0
- package/out/renderer/assets/pierre-light-BUzWTcjO.js.gz +0 -0
- package/out/renderer/assets/pierre-light-protanopia-deuteranopia-DlvVSCaI.js +4 -0
- package/out/renderer/assets/pierre-light-protanopia-deuteranopia-DlvVSCaI.js.br +0 -0
- package/out/renderer/assets/pierre-light-protanopia-deuteranopia-DlvVSCaI.js.gz +0 -0
- package/out/renderer/assets/pierre-light-soft-CCMU-Zh0.js +4 -0
- package/out/renderer/assets/pierre-light-soft-CCMU-Zh0.js.br +0 -0
- package/out/renderer/assets/pierre-light-soft-CCMU-Zh0.js.gz +0 -0
- package/out/renderer/assets/pierre-light-tritanopia-v4xacE1C.js +4 -0
- package/out/renderer/assets/pierre-light-tritanopia-v4xacE1C.js.br +0 -0
- package/out/renderer/assets/pierre-light-tritanopia-v4xacE1C.js.gz +0 -0
- package/out/renderer/assets/pierre-light-vibrant-BRUbQnMc.js +4 -0
- package/out/renderer/assets/pierre-light-vibrant-BRUbQnMc.js.br +0 -0
- package/out/renderer/assets/pierre-light-vibrant-BRUbQnMc.js.gz +0 -0
- package/out/renderer/assets/pptx_parser_bg-C6x8HRdb.wasm +0 -0
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-B_oUGzKN.js → quadrantDiagram-34T5L4WZ-B5mGDuN5.js} +2 -2
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B5mGDuN5.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B5mGDuN5.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-B-Y1DmN9-CMFsEp7s.js +25 -0
- package/out/renderer/assets/render-worker-host-B-Y1DmN9-CMFsEp7s.js.br +0 -0
- package/out/renderer/assets/render-worker-host-B-Y1DmN9-CMFsEp7s.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-B5otq5TA-D0PN4GJN.js +25 -0
- package/out/renderer/assets/render-worker-host-B5otq5TA-D0PN4GJN.js.br +0 -0
- package/out/renderer/assets/render-worker-host-B5otq5TA-D0PN4GJN.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-GGVmi0tj-BJOvCVyx.js +25 -0
- package/out/renderer/assets/render-worker-host-GGVmi0tj-BJOvCVyx.js.br +0 -0
- package/out/renderer/assets/render-worker-host-GGVmi0tj-BJOvCVyx.js.gz +0 -0
- package/out/renderer/assets/{requirementDiagram-MS252O5E-LQY3T05J.js → requirementDiagram-MS252O5E-CiGX4Xpv.js} +3 -3
- package/out/renderer/assets/requirementDiagram-MS252O5E-CiGX4Xpv.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-CiGX4Xpv.js.gz +0 -0
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-BZrdYvkl.js → sankeyDiagram-XADWPNL6-BPM4lpDs.js} +1 -1
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BPM4lpDs.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BPM4lpDs.js.gz +0 -0
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-DT03DGl3.js → sequenceDiagram-FGHM5R23-D1Ok0mDp.js} +3 -3
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-D1Ok0mDp.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-D1Ok0mDp.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-XxvRQ2fw.js → stateDiagram-FHFEXIEX-C0DqB63K.js} +8 -8
- package/out/renderer/assets/stateDiagram-FHFEXIEX-C0DqB63K.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-C0DqB63K.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-C8lZQVxS.js → stateDiagram-v2-QKLJ7IA2-CcTyZcy9.js} +4 -4
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-BThN9RD2.js → timeline-definition-GMOUNBTQ-CY70j9aj.js} +2 -2
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-CY70j9aj.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-CY70j9aj.js.gz +0 -0
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-DvL9CApP.js → vennDiagram-DHZGUBPP-DpZP-SME.js} +1 -1
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DpZP-SME.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DpZP-SME.js.gz +0 -0
- package/out/renderer/assets/{wardley-RL74JXVD-B4vPxA-A.js → wardley-RL74JXVD-DUTOcssT.js} +3 -3
- package/out/renderer/assets/wardley-RL74JXVD-DUTOcssT.js.br +0 -0
- package/out/renderer/assets/{wardley-RL74JXVD-B4vPxA-A.js.gz → wardley-RL74JXVD-DUTOcssT.js.gz} +0 -0
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-A3F8zuNA.js → wardleyDiagram-NUSXRM2D-ZVKE_8YQ.js} +5 -5
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-ZVKE_8YQ.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-ZVKE_8YQ.js.gz +0 -0
- package/out/renderer/assets/xlsx_parser_bg-ByWgODYl.wasm +0 -0
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-BxjT7l5Q.js → xychartDiagram-5P7HB3ND-B8kViTNI.js} +2 -2
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-B8kViTNI.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-B8kViTNI.js.gz +0 -0
- package/out/renderer/index.html +2 -2
- package/out/renderer/index.html.br +0 -0
- package/out/renderer/index.html.gz +0 -0
- package/out/scripts/electron-preload/preload.mjs +21 -0
- package/out/scripts/mcp-image-generation/server.mjs +140 -0
- package/out/scripts/mcp-memo/server.mjs +268 -0
- package/out/scripts/mcp-memory/server.mjs +183 -0
- package/out/scripts/mcp-search/server.mjs +1 -1
- package/out/scripts/mcp-toolbox/server.mjs +482 -0
- package/out/scripts/worker-file-outline/worker.mjs +242 -28
- package/out/server/main.js +3548 -1332
- package/package.json +16 -13
- package/resources/tree-sitter-wasm/tree-sitter-dart.wasm +0 -0
- package/out/renderer/assets/_baseUniq-BonfEMiF.js.br +0 -0
- package/out/renderer/assets/_baseUniq-BonfEMiF.js.gz +0 -0
- package/out/renderer/assets/arc-Do8LbeMR.js.br +0 -0
- package/out/renderer/assets/arc-Do8LbeMR.js.gz +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-B8pyh3AH.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-B8pyh3AH.js.gz +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-DxehDaBQ.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-DxehDaBQ.js.gz +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BwVB2HtH.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-Mp3JyPop.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-Mp3JyPop.js.gz +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-BQEQxqzJ.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-BQEQxqzJ.js.gz +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-D19mZGkc.js.br +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-D19mZGkc.js.gz +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-BEBfdXkA.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-BEBfdXkA.js.gz +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-6SeriN8Z.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-6SeriN8Z.js.gz +0 -0
- package/out/renderer/assets/dagre-KV5264BT-gXq994RD.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-gXq994RD.js.gz +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-GOebOMWt.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-GOebOMWt.js.gz +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-BkQmAuCz.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-BkQmAuCz.js.gz +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-Q9B0Tkq3.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-Q9B0Tkq3.js.gz +0 -0
- package/out/renderer/assets/diagram-TYMM5635-5wNVFKxe.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-5wNVFKxe.js.gz +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-DRxQnVgW.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-DRxQnVgW.js.gz +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-3uIpRmli.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-3uIpRmli.js.gz +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CFxauQFp.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CFxauQFp.js.gz +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-CDBCF75U.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-CDBCF75U.js.gz +0 -0
- package/out/renderer/assets/graph-B77t0Iut.js.br +0 -0
- package/out/renderer/assets/graph-B77t0Iut.js.gz +0 -0
- package/out/renderer/assets/index-CTSkyk5N.css +0 -7619
- package/out/renderer/assets/index-CTSkyk5N.css.br +0 -0
- package/out/renderer/assets/index-CTSkyk5N.css.gz +0 -0
- package/out/renderer/assets/index-l_WeGi7a.js.br +0 -0
- package/out/renderer/assets/index-l_WeGi7a.js.gz +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-C59I-VqG.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-C59I-VqG.js.gz +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-B6jawzfM.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-B6jawzfM.js.gz +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-BCXhVxbs.js.br +0 -0
- package/out/renderer/assets/layout-zx9noErc.js.br +0 -0
- package/out/renderer/assets/layout-zx9noErc.js.gz +0 -0
- package/out/renderer/assets/linear-Bo25ELwI.js.br +0 -0
- package/out/renderer/assets/linear-Bo25ELwI.js.gz +0 -0
- package/out/renderer/assets/min-eGRLXD6u.js.br +0 -0
- package/out/renderer/assets/min-eGRLXD6u.js.gz +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-PUpW_gKO.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-PUpW_gKO.js.gz +0 -0
- package/out/renderer/assets/pdf-worker-wrapper-Do-ikGHl.js.br +0 -0
- package/out/renderer/assets/pdf-worker-wrapper-Do-ikGHl.js.gz +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-BrSaX9YD.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-BrSaX9YD.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-C-Drv5KU.js +0 -4
- package/out/renderer/assets/pierre-dark-C-Drv5KU.js.br +0 -0
- package/out/renderer/assets/pierre-dark-C-Drv5KU.js.gz +0 -0
- package/out/renderer/assets/pierre-dark-soft-Cd74uQaL.js +0 -4
- package/out/renderer/assets/pierre-dark-soft-Cd74uQaL.js.br +0 -0
- package/out/renderer/assets/pierre-dark-soft-Cd74uQaL.js.gz +0 -0
- package/out/renderer/assets/pierre-light-CfQnmt6J.js +0 -4
- package/out/renderer/assets/pierre-light-CfQnmt6J.js.br +0 -0
- package/out/renderer/assets/pierre-light-CfQnmt6J.js.gz +0 -0
- package/out/renderer/assets/pierre-light-soft-DMVdU74b.js +0 -4
- package/out/renderer/assets/pierre-light-soft-DMVdU74b.js.br +0 -0
- package/out/renderer/assets/pierre-light-soft-DMVdU74b.js.gz +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B_oUGzKN.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B_oUGzKN.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-4IbvpiUo-Dc5a8nQ-.js +0 -25
- package/out/renderer/assets/render-worker-host-4IbvpiUo-Dc5a8nQ-.js.br +0 -0
- package/out/renderer/assets/render-worker-host-4IbvpiUo-Dc5a8nQ-.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-BdfGz_ou-AC9asZT1.js +0 -25
- package/out/renderer/assets/render-worker-host-BdfGz_ou-AC9asZT1.js.br +0 -0
- package/out/renderer/assets/render-worker-host-BdfGz_ou-AC9asZT1.js.gz +0 -0
- package/out/renderer/assets/render-worker-host-awn_IPjt-Bowndb19.js +0 -25
- package/out/renderer/assets/render-worker-host-awn_IPjt-Bowndb19.js.br +0 -0
- package/out/renderer/assets/render-worker-host-awn_IPjt-Bowndb19.js.gz +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-LQY3T05J.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-LQY3T05J.js.gz +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BZrdYvkl.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BZrdYvkl.js.gz +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DT03DGl3.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DT03DGl3.js.gz +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-XxvRQ2fw.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-XxvRQ2fw.js.gz +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-BThN9RD2.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-BThN9RD2.js.gz +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DvL9CApP.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DvL9CApP.js.gz +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-B4vPxA-A.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-A3F8zuNA.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-A3F8zuNA.js.gz +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-BxjT7l5Q.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-BxjT7l5Q.js.gz +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as http from "http";
|
|
6
|
+
const memoryQueryRequestSchema = z.object({
|
|
7
|
+
query: z.string().min(1).optional().describe(
|
|
8
|
+
"Focused topic to retrieve. Required for every specific task, question, recommendation, or domain discussion; never omit it merely to discover whether relevant memories exist. Omit only when a broad project-memory briefing is genuinely needed."
|
|
9
|
+
)
|
|
10
|
+
});
|
|
11
|
+
const memoryQueryRespondSchema = z.object({
|
|
12
|
+
content: z.string().describe("The generated project briefing or relevant memory details.")
|
|
13
|
+
});
|
|
14
|
+
const memoryStoreRequestSchema = z.object({
|
|
15
|
+
facts: z.array(
|
|
16
|
+
z.object({
|
|
17
|
+
text: z.string().max(512).describe("The fact to remember, concise and self-contained."),
|
|
18
|
+
reason: z.string().max(300).optional().describe(
|
|
19
|
+
"Why this should be remembered — context that helps determine weight and tags (e.g. if the user strongly emphasized it or corrected the agent)."
|
|
20
|
+
)
|
|
21
|
+
})
|
|
22
|
+
).min(1).max(10).describe(
|
|
23
|
+
"Facts to remember. The system will organize, deduplicate, and assign priority in the background."
|
|
24
|
+
)
|
|
25
|
+
});
|
|
26
|
+
const memoryStoreRespondSchema = z.object({
|
|
27
|
+
stored: z.number().describe("Number of facts submitted for integration."),
|
|
28
|
+
message: z.string().optional().describe("Brief confirmation of the memory operation.")
|
|
29
|
+
});
|
|
30
|
+
function getArg(name) {
|
|
31
|
+
const idx = process.argv.indexOf(`--${name}`);
|
|
32
|
+
return idx !== -1 ? process.argv[idx + 1] : void 0;
|
|
33
|
+
}
|
|
34
|
+
function getErrorMessage(error) {
|
|
35
|
+
return error instanceof Error ? error.message : String(error);
|
|
36
|
+
}
|
|
37
|
+
function loadCriticalMemories(filePath) {
|
|
38
|
+
if (!filePath) return [];
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
41
|
+
return Array.isArray(parsed) ? parsed.filter((entry) => typeof entry === "string") : [];
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error(`[mcp-memory] Failed to load critical memories: ${getErrorMessage(error)}`);
|
|
44
|
+
return [];
|
|
45
|
+
} finally {
|
|
46
|
+
fs.rmSync(filePath, { force: true });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const socketPath = getArg("socket-path");
|
|
50
|
+
const criticalMemories = loadCriticalMemories(getArg("critical-memory"));
|
|
51
|
+
if (!socketPath) {
|
|
52
|
+
console.error("[mcp-memory] Missing required argument: --socket-path");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const criticalMemoryDescription = criticalMemories.length === 0 ? "" : `
|
|
56
|
+
|
|
57
|
+
Automatically loaded critical project memories — always follow these:
|
|
58
|
+
${criticalMemories.map((memory) => `- ${memory.replaceAll("\n", "\n ")}`).join("\n")}
|
|
59
|
+
|
|
60
|
+
These are only the highest-priority project constraints, not the complete project memory. Do not treat the absence of a detail here as evidence that no relevant memory exists. This list does not replace task-specific retrieval.`;
|
|
61
|
+
const server = new McpServer({
|
|
62
|
+
name: "Memory",
|
|
63
|
+
version: "1.0.0",
|
|
64
|
+
description: "Provides memory_query and memory_store tools for persistent project-level memory."
|
|
65
|
+
});
|
|
66
|
+
server.registerTool(
|
|
67
|
+
"memory_query",
|
|
68
|
+
{
|
|
69
|
+
description: `Query the project's persistent memory.${criticalMemoryDescription}
|
|
70
|
+
|
|
71
|
+
For every specific task, question, recommendation, or domain discussion that may depend on memory, provide a focused query. Include all relevant dimensions in that query, such as applicable conventions, preferences, decisions, corrections, architecture, or commands.
|
|
72
|
+
|
|
73
|
+
Never omit query merely to discover whether relevant memories exist. Omit it only when a broad project-memory briefing is genuinely needed, such as when the user asks what is remembered.
|
|
74
|
+
|
|
75
|
+
A focused query returns relevant details. An omitted query generates a current summary from the stored entries. In either mode, memories included in the response are marked as used.`,
|
|
76
|
+
inputSchema: memoryQueryRequestSchema
|
|
77
|
+
},
|
|
78
|
+
async (input) => {
|
|
79
|
+
try {
|
|
80
|
+
const result = memoryQueryRespondSchema.parse(await postToSocket("/memory/query", input));
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: "text",
|
|
85
|
+
text: result.content || "(no project memories stored yet)"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
};
|
|
89
|
+
} catch (error) {
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{ type: "text", text: `Error querying memory: ${getErrorMessage(error)}` }
|
|
93
|
+
],
|
|
94
|
+
isError: true
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
server.registerTool(
|
|
100
|
+
"memory_store",
|
|
101
|
+
{
|
|
102
|
+
description: `Store facts into persistent project memory for future sessions.
|
|
103
|
+
|
|
104
|
+
Proactively store facts worth remembering for future sessions. Common triggers:
|
|
105
|
+
- User states a preference, makes a choice, or corrects your behavior (even subtly)
|
|
106
|
+
- You discover a project convention, tech stack detail, or architectural decision
|
|
107
|
+
- User emphasizes something with "always", "never", "remember", "一定", "不要"
|
|
108
|
+
- User explicitly asks you to remember something
|
|
109
|
+
|
|
110
|
+
Also store when:
|
|
111
|
+
- User explains why they do something a certain way
|
|
112
|
+
- User mentions a tool, framework, or library choice
|
|
113
|
+
- You make a decision during the conversation that affects future work
|
|
114
|
+
- User tells you to skip or avoid something
|
|
115
|
+
|
|
116
|
+
When in doubt about whether to store — store it. Forgetting costs more than duplicating.
|
|
117
|
+
|
|
118
|
+
Each fact should be a concise, self-contained statement. Include a reason when the context helps determine importance (e.g. if the user strongly emphasized it or corrected the agent).`,
|
|
119
|
+
inputSchema: memoryStoreRequestSchema
|
|
120
|
+
},
|
|
121
|
+
async (input) => {
|
|
122
|
+
try {
|
|
123
|
+
const result = memoryStoreRespondSchema.parse(await postToSocket("/memory/store", input));
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: result.message || `Stored ${result.stored} fact(s) to project memory.`
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
};
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{ type: "text", text: `Error storing memory: ${getErrorMessage(error)}` }
|
|
136
|
+
],
|
|
137
|
+
isError: true
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
function postToSocket(path, body) {
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
const data = JSON.stringify(body);
|
|
145
|
+
const options = {
|
|
146
|
+
socketPath,
|
|
147
|
+
path,
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
"Content-Length": Buffer.byteLength(data)
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const req = http.request(options, (res) => {
|
|
155
|
+
const chunks = [];
|
|
156
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
157
|
+
res.on("end", () => {
|
|
158
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
159
|
+
try {
|
|
160
|
+
const parsed = JSON.parse(raw);
|
|
161
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
162
|
+
resolve(parsed);
|
|
163
|
+
} else {
|
|
164
|
+
const message = typeof parsed === "object" && parsed && "error" in parsed ? String(parsed.error) : `HTTP ${res.statusCode}: ${raw}`;
|
|
165
|
+
reject(new Error(message));
|
|
166
|
+
}
|
|
167
|
+
} catch {
|
|
168
|
+
reject(new Error(`Invalid response (${res.statusCode}): ${raw}`));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
req.on("error", (error) => {
|
|
173
|
+
reject(new Error(`Socket request failed: ${error.message}`));
|
|
174
|
+
});
|
|
175
|
+
req.write(data);
|
|
176
|
+
req.end();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
async function main() {
|
|
180
|
+
const transport = new StdioServerTransport();
|
|
181
|
+
await server.connect(transport);
|
|
182
|
+
}
|
|
183
|
+
main().catch(console.error);
|
|
@@ -161,7 +161,7 @@ Uses tree-sitter WASM parsing to extract function/class/interface/type/property
|
|
|
161
161
|
Returns tree-structured metadata only - no code body is included.
|
|
162
162
|
Use this first before ReadFile to understand a file's structure.
|
|
163
163
|
|
|
164
|
-
Supports: TypeScript (.ts), JavaScript/JSX (.js/.jsx/.mjs/.cjs), TSX (.tsx), Python (.py), Go (.go), C (.c/.h), C++ (.cpp/.cc/.cxx/.hpp/.hxx/.hh), Swift (.swift), Kotlin (.kt/.kts), Markdown (.md/.mdx/.markdown).
|
|
164
|
+
Supports: TypeScript (.ts), JavaScript/JSX (.js/.jsx/.mjs/.cjs), TSX (.tsx), Python (.py), Go (.go), C (.c/.h), C++ (.cpp/.cc/.cxx/.hpp/.hxx/.hh), Swift (.swift), Kotlin (.kt/.kts), Dart (.dart), Markdown (.md/.mdx/.markdown).
|
|
165
165
|
|
|
166
166
|
The path parameter accepts:
|
|
167
167
|
- Relative path (relative to project root): "src/app.ts", "./lib/utils.ts"
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import * as http from "http";
|
|
5
|
+
const base64EncodeRequestSchema = z.object({
|
|
6
|
+
text: z.string().describe("The text string to encode into Base64.")
|
|
7
|
+
});
|
|
8
|
+
const base64EncodeRespondSchema = z.object({
|
|
9
|
+
result: z.string()
|
|
10
|
+
});
|
|
11
|
+
const base64DecodeRequestSchema = z.object({
|
|
12
|
+
base64: z.string().describe("The Base64-encoded string to decode back into text.")
|
|
13
|
+
});
|
|
14
|
+
const base64DecodeRespondSchema = z.object({
|
|
15
|
+
result: z.string()
|
|
16
|
+
});
|
|
17
|
+
const urlEncodeRequestSchema = z.object({
|
|
18
|
+
text: z.string().describe("The text string to URL-encode.")
|
|
19
|
+
});
|
|
20
|
+
const urlEncodeRespondSchema = z.object({
|
|
21
|
+
result: z.string()
|
|
22
|
+
});
|
|
23
|
+
const urlDecodeRequestSchema = z.object({
|
|
24
|
+
text: z.string().describe("The URL-encoded string to decode.")
|
|
25
|
+
});
|
|
26
|
+
const urlDecodeRespondSchema = z.object({
|
|
27
|
+
result: z.string()
|
|
28
|
+
});
|
|
29
|
+
const hashRequestSchema = z.object({
|
|
30
|
+
text: z.string().describe("The text to hash."),
|
|
31
|
+
algorithm: z.enum(["md5", "sha1", "sha256"]).default("sha256").describe("Hash algorithm: md5, sha1, or sha256. Default: sha256.")
|
|
32
|
+
});
|
|
33
|
+
const hashRespondSchema = z.object({
|
|
34
|
+
result: z.string()
|
|
35
|
+
});
|
|
36
|
+
const timeRequestSchema = z.object({
|
|
37
|
+
format: z.enum(["iso", "timestamp"]).default("iso").describe(
|
|
38
|
+
"Output format: 'iso' for ISO 8601 string, 'timestamp' for Unix timestamp in seconds."
|
|
39
|
+
)
|
|
40
|
+
});
|
|
41
|
+
const timeRespondSchema = z.object({
|
|
42
|
+
result: z.union([z.string(), z.number()])
|
|
43
|
+
});
|
|
44
|
+
const uuidRequestSchema = z.object({});
|
|
45
|
+
const uuidRespondSchema = z.object({
|
|
46
|
+
result: z.string()
|
|
47
|
+
});
|
|
48
|
+
const shortIdRequestSchema = z.object({
|
|
49
|
+
length: z.number().int().min(4).max(32).default(8).describe("Length of the short ID (4-32). Default: 8.")
|
|
50
|
+
});
|
|
51
|
+
const shortIdRespondSchema = z.object({
|
|
52
|
+
result: z.string()
|
|
53
|
+
});
|
|
54
|
+
const randomRequestSchema = z.object({
|
|
55
|
+
length: z.number().int().min(1).max(256).default(16).describe("Length of the random string (1-256). Default: 16."),
|
|
56
|
+
charset: z.enum(["alphanumeric", "alpha", "numeric", "hex"]).default("alphanumeric").describe("Character set: alphanumeric, alpha, numeric, or hex. Default: alphanumeric.")
|
|
57
|
+
});
|
|
58
|
+
const randomRespondSchema = z.object({
|
|
59
|
+
result: z.string()
|
|
60
|
+
});
|
|
61
|
+
const randIntRequestSchema = z.object({
|
|
62
|
+
min: z.number().int().describe("Minimum value (inclusive)."),
|
|
63
|
+
max: z.number().int().describe("Maximum value (inclusive).")
|
|
64
|
+
});
|
|
65
|
+
const randIntRespondSchema = z.object({
|
|
66
|
+
result: z.number().int()
|
|
67
|
+
});
|
|
68
|
+
const choiceRequestSchema = z.object({
|
|
69
|
+
items: z.array(z.string()).min(1).describe("Array of items to choose from.")
|
|
70
|
+
});
|
|
71
|
+
const choiceRespondSchema = z.object({
|
|
72
|
+
result: z.string()
|
|
73
|
+
});
|
|
74
|
+
const shuffleRequestSchema = z.object({
|
|
75
|
+
items: z.array(z.string()).min(1).describe("Array of items to shuffle.")
|
|
76
|
+
});
|
|
77
|
+
const shuffleRespondSchema = z.object({
|
|
78
|
+
result: z.array(z.string())
|
|
79
|
+
});
|
|
80
|
+
const imageMetadataRequestSchema = z.object({
|
|
81
|
+
path: z.string().describe("Absolute or project-relative path to the image file.")
|
|
82
|
+
});
|
|
83
|
+
const imageMetadataRespondSchema = z.object({
|
|
84
|
+
result: z.object({
|
|
85
|
+
width: z.number().optional(),
|
|
86
|
+
height: z.number().optional(),
|
|
87
|
+
format: z.string().optional(),
|
|
88
|
+
space: z.string().optional(),
|
|
89
|
+
channels: z.number().optional(),
|
|
90
|
+
depth: z.string().optional(),
|
|
91
|
+
density: z.number().optional(),
|
|
92
|
+
hasAlpha: z.boolean().optional(),
|
|
93
|
+
size: z.number().optional()
|
|
94
|
+
})
|
|
95
|
+
});
|
|
96
|
+
const imageThumbnailRequestSchema = z.object({
|
|
97
|
+
path: z.string().describe("Absolute or project-relative path to the source image."),
|
|
98
|
+
width: z.number().int().min(1).max(1024).default(200).describe("Thumbnail width in pixels (1-1024). Default: 200."),
|
|
99
|
+
output: z.string().optional().describe("Output path. If omitted, saves alongside source with '.thumb{width}' suffix.")
|
|
100
|
+
});
|
|
101
|
+
const imageThumbnailRespondSchema = z.object({
|
|
102
|
+
result: z.object({
|
|
103
|
+
output: z.string(),
|
|
104
|
+
metadata: imageMetadataRespondSchema.shape.result
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
const imageResizeRequestSchema = z.object({
|
|
108
|
+
path: z.string().describe("Absolute or project-relative path to the source image."),
|
|
109
|
+
width: z.number().int().min(1).optional().describe("Target width in pixels."),
|
|
110
|
+
height: z.number().int().min(1).optional().describe("Target height in pixels."),
|
|
111
|
+
fit: z.enum(["cover", "contain", "fill", "inside", "outside"]).default("inside").describe("How to fit the image: cover, contain, fill, inside, outside. Default: inside."),
|
|
112
|
+
output: z.string().optional().describe("Output path. If omitted, saves alongside source with '.{width}x{height}' suffix.")
|
|
113
|
+
});
|
|
114
|
+
const imageResizeRespondSchema = z.object({
|
|
115
|
+
result: z.object({
|
|
116
|
+
output: z.string(),
|
|
117
|
+
metadata: imageMetadataRespondSchema.shape.result
|
|
118
|
+
})
|
|
119
|
+
});
|
|
120
|
+
const imageConvertRequestSchema = z.object({
|
|
121
|
+
path: z.string().describe("Absolute or project-relative path to the source image."),
|
|
122
|
+
format: z.enum(["jpeg", "png", "webp", "avif", "tiff"]).describe("Target image format."),
|
|
123
|
+
quality: z.number().int().min(1).max(100).optional().describe("Quality for lossy formats (1-100). Applies to jpeg, webp, avif."),
|
|
124
|
+
output: z.string().optional().describe("Output path. If omitted, saves alongside source with new extension.")
|
|
125
|
+
});
|
|
126
|
+
const imageConvertRespondSchema = z.object({
|
|
127
|
+
result: z.object({
|
|
128
|
+
output: z.string(),
|
|
129
|
+
metadata: imageMetadataRespondSchema.shape.result
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
function getArg(name) {
|
|
133
|
+
const idx = process.argv.indexOf(`--${name}`);
|
|
134
|
+
return idx !== -1 ? process.argv[idx + 1] : void 0;
|
|
135
|
+
}
|
|
136
|
+
const socketPath = getArg("socket-path");
|
|
137
|
+
const projectDir = getArg("project-dir");
|
|
138
|
+
if (!socketPath) {
|
|
139
|
+
console.error("[mcp-toolbox] Missing required argument: --socket-path");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
if (!projectDir) {
|
|
143
|
+
console.error("[mcp-toolbox] Missing required argument: --project-dir");
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
const server = new McpServer({
|
|
147
|
+
name: "Toolbox",
|
|
148
|
+
version: "1.0.0",
|
|
149
|
+
description: "Built-in utility tools: base64, URL encode/decode, hash, time, UUID, random, etc."
|
|
150
|
+
});
|
|
151
|
+
server.registerTool(
|
|
152
|
+
"base64_encode",
|
|
153
|
+
{
|
|
154
|
+
description: "Encode a text string into Base64 format. Supports UTF-8 text.",
|
|
155
|
+
inputSchema: base64EncodeRequestSchema
|
|
156
|
+
},
|
|
157
|
+
async (input) => {
|
|
158
|
+
try {
|
|
159
|
+
const res = base64EncodeRespondSchema.parse(
|
|
160
|
+
await postToSocket("/toolbox/base64-encode", { text: input.text })
|
|
161
|
+
);
|
|
162
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
163
|
+
} catch (err) {
|
|
164
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
server.registerTool(
|
|
169
|
+
"base64_decode",
|
|
170
|
+
{
|
|
171
|
+
description: "Decode a Base64-encoded string back into UTF-8 text.",
|
|
172
|
+
inputSchema: base64DecodeRequestSchema
|
|
173
|
+
},
|
|
174
|
+
async (input) => {
|
|
175
|
+
try {
|
|
176
|
+
const res = base64DecodeRespondSchema.parse(
|
|
177
|
+
await postToSocket("/toolbox/base64-decode", { base64: input.base64 })
|
|
178
|
+
);
|
|
179
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
180
|
+
} catch (err) {
|
|
181
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
server.registerTool(
|
|
186
|
+
"url_encode",
|
|
187
|
+
{
|
|
188
|
+
description: "URL-encode a text string (percent-encoding).",
|
|
189
|
+
inputSchema: urlEncodeRequestSchema
|
|
190
|
+
},
|
|
191
|
+
async (input) => {
|
|
192
|
+
try {
|
|
193
|
+
const res = urlEncodeRespondSchema.parse(
|
|
194
|
+
await postToSocket("/toolbox/url-encode", { text: input.text })
|
|
195
|
+
);
|
|
196
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
197
|
+
} catch (err) {
|
|
198
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
server.registerTool(
|
|
203
|
+
"url_decode",
|
|
204
|
+
{
|
|
205
|
+
description: "Decode a URL-encoded (percent-encoded) string back into text.",
|
|
206
|
+
inputSchema: urlDecodeRequestSchema
|
|
207
|
+
},
|
|
208
|
+
async (input) => {
|
|
209
|
+
try {
|
|
210
|
+
const res = urlDecodeRespondSchema.parse(
|
|
211
|
+
await postToSocket("/toolbox/url-decode", { text: input.text })
|
|
212
|
+
);
|
|
213
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
214
|
+
} catch (err) {
|
|
215
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
server.registerTool(
|
|
220
|
+
"hash",
|
|
221
|
+
{
|
|
222
|
+
description: "Compute a hash (MD5, SHA1, or SHA256) of a text string. Returns hex digest.",
|
|
223
|
+
inputSchema: hashRequestSchema
|
|
224
|
+
},
|
|
225
|
+
async (input) => {
|
|
226
|
+
try {
|
|
227
|
+
const res = hashRespondSchema.parse(
|
|
228
|
+
await postToSocket("/toolbox/hash", {
|
|
229
|
+
text: input.text,
|
|
230
|
+
algorithm: input.algorithm
|
|
231
|
+
})
|
|
232
|
+
);
|
|
233
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
234
|
+
} catch (err) {
|
|
235
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
server.registerTool(
|
|
240
|
+
"time",
|
|
241
|
+
{
|
|
242
|
+
description: "Get the current time. Returns either an ISO 8601 string or a Unix timestamp in seconds.",
|
|
243
|
+
inputSchema: timeRequestSchema
|
|
244
|
+
},
|
|
245
|
+
async (input) => {
|
|
246
|
+
try {
|
|
247
|
+
const res = timeRespondSchema.parse(
|
|
248
|
+
await postToSocket("/toolbox/time", { format: input.format })
|
|
249
|
+
);
|
|
250
|
+
return { content: [{ type: "text", text: String(res.result) }] };
|
|
251
|
+
} catch (err) {
|
|
252
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
server.registerTool(
|
|
257
|
+
"uuid",
|
|
258
|
+
{
|
|
259
|
+
description: "Generate a random UUID v4.",
|
|
260
|
+
inputSchema: uuidRequestSchema
|
|
261
|
+
},
|
|
262
|
+
async () => {
|
|
263
|
+
try {
|
|
264
|
+
const res = uuidRespondSchema.parse(await postToSocket("/toolbox/uuid", {}));
|
|
265
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
266
|
+
} catch (err) {
|
|
267
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
server.registerTool(
|
|
272
|
+
"short_id",
|
|
273
|
+
{
|
|
274
|
+
description: "Generate a short random alphanumeric ID.",
|
|
275
|
+
inputSchema: shortIdRequestSchema
|
|
276
|
+
},
|
|
277
|
+
async (input) => {
|
|
278
|
+
try {
|
|
279
|
+
const res = shortIdRespondSchema.parse(
|
|
280
|
+
await postToSocket("/toolbox/short-id", { length: input.length })
|
|
281
|
+
);
|
|
282
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
283
|
+
} catch (err) {
|
|
284
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
);
|
|
288
|
+
server.registerTool(
|
|
289
|
+
"random",
|
|
290
|
+
{
|
|
291
|
+
description: "Generate a random string with specified length and character set.",
|
|
292
|
+
inputSchema: randomRequestSchema
|
|
293
|
+
},
|
|
294
|
+
async (input) => {
|
|
295
|
+
try {
|
|
296
|
+
const res = randomRespondSchema.parse(
|
|
297
|
+
await postToSocket("/toolbox/random", {
|
|
298
|
+
length: input.length,
|
|
299
|
+
charset: input.charset
|
|
300
|
+
})
|
|
301
|
+
);
|
|
302
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
303
|
+
} catch (err) {
|
|
304
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
server.registerTool(
|
|
309
|
+
"rand_int",
|
|
310
|
+
{
|
|
311
|
+
description: "Generate a random integer between min and max (inclusive).",
|
|
312
|
+
inputSchema: randIntRequestSchema
|
|
313
|
+
},
|
|
314
|
+
async (input) => {
|
|
315
|
+
try {
|
|
316
|
+
const res = randIntRespondSchema.parse(
|
|
317
|
+
await postToSocket("/toolbox/rand-int", { min: input.min, max: input.max })
|
|
318
|
+
);
|
|
319
|
+
return { content: [{ type: "text", text: String(res.result) }] };
|
|
320
|
+
} catch (err) {
|
|
321
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
);
|
|
325
|
+
server.registerTool(
|
|
326
|
+
"choice",
|
|
327
|
+
{
|
|
328
|
+
description: "Pick a random item from an array.",
|
|
329
|
+
inputSchema: choiceRequestSchema
|
|
330
|
+
},
|
|
331
|
+
async (input) => {
|
|
332
|
+
try {
|
|
333
|
+
const res = choiceRespondSchema.parse(
|
|
334
|
+
await postToSocket("/toolbox/choice", { items: input.items })
|
|
335
|
+
);
|
|
336
|
+
return { content: [{ type: "text", text: res.result }] };
|
|
337
|
+
} catch (err) {
|
|
338
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
);
|
|
342
|
+
server.registerTool(
|
|
343
|
+
"shuffle",
|
|
344
|
+
{
|
|
345
|
+
description: "Shuffle an array randomly (Fisher-Yates).",
|
|
346
|
+
inputSchema: shuffleRequestSchema
|
|
347
|
+
},
|
|
348
|
+
async (input) => {
|
|
349
|
+
try {
|
|
350
|
+
const res = shuffleRespondSchema.parse(
|
|
351
|
+
await postToSocket("/toolbox/shuffle", { items: input.items })
|
|
352
|
+
);
|
|
353
|
+
return { content: [{ type: "text", text: JSON.stringify(res.result) }] };
|
|
354
|
+
} catch (err) {
|
|
355
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
server.registerTool(
|
|
360
|
+
"image_metadata",
|
|
361
|
+
{
|
|
362
|
+
description: "Read image metadata (width, height, format, color space, channels, etc.) from a file.",
|
|
363
|
+
inputSchema: imageMetadataRequestSchema
|
|
364
|
+
},
|
|
365
|
+
async (input) => {
|
|
366
|
+
try {
|
|
367
|
+
const res = imageMetadataRespondSchema.parse(
|
|
368
|
+
await postToSocket("/toolbox/image-metadata", { path: input.path })
|
|
369
|
+
);
|
|
370
|
+
return { content: [{ type: "text", text: JSON.stringify(res.result, null, 2) }] };
|
|
371
|
+
} catch (err) {
|
|
372
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
);
|
|
376
|
+
server.registerTool(
|
|
377
|
+
"image_thumbnail",
|
|
378
|
+
{
|
|
379
|
+
description: "Generate a thumbnail from an image. Returns the output file path and new image metadata.",
|
|
380
|
+
inputSchema: imageThumbnailRequestSchema
|
|
381
|
+
},
|
|
382
|
+
async (input) => {
|
|
383
|
+
try {
|
|
384
|
+
const res = imageThumbnailRespondSchema.parse(
|
|
385
|
+
await postToSocket("/toolbox/image-thumbnail", {
|
|
386
|
+
path: input.path,
|
|
387
|
+
width: input.width,
|
|
388
|
+
output: input.output
|
|
389
|
+
})
|
|
390
|
+
);
|
|
391
|
+
return { content: [{ type: "text", text: JSON.stringify(res.result, null, 2) }] };
|
|
392
|
+
} catch (err) {
|
|
393
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
server.registerTool(
|
|
398
|
+
"image_resize",
|
|
399
|
+
{
|
|
400
|
+
description: "Resize an image to specified dimensions. Returns the output file path and new image metadata.",
|
|
401
|
+
inputSchema: imageResizeRequestSchema
|
|
402
|
+
},
|
|
403
|
+
async (input) => {
|
|
404
|
+
try {
|
|
405
|
+
const res = imageResizeRespondSchema.parse(
|
|
406
|
+
await postToSocket("/toolbox/image-resize", {
|
|
407
|
+
path: input.path,
|
|
408
|
+
width: input.width,
|
|
409
|
+
height: input.height,
|
|
410
|
+
fit: input.fit,
|
|
411
|
+
output: input.output
|
|
412
|
+
})
|
|
413
|
+
);
|
|
414
|
+
return { content: [{ type: "text", text: JSON.stringify(res.result, null, 2) }] };
|
|
415
|
+
} catch (err) {
|
|
416
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
);
|
|
420
|
+
server.registerTool(
|
|
421
|
+
"image_convert",
|
|
422
|
+
{
|
|
423
|
+
description: "Convert an image to a different format (jpeg, png, webp, avif, tiff). Returns the output file path and new image metadata.",
|
|
424
|
+
inputSchema: imageConvertRequestSchema
|
|
425
|
+
},
|
|
426
|
+
async (input) => {
|
|
427
|
+
try {
|
|
428
|
+
const res = imageConvertRespondSchema.parse(
|
|
429
|
+
await postToSocket("/toolbox/image-convert", {
|
|
430
|
+
path: input.path,
|
|
431
|
+
format: input.format,
|
|
432
|
+
quality: input.quality,
|
|
433
|
+
output: input.output
|
|
434
|
+
})
|
|
435
|
+
);
|
|
436
|
+
return { content: [{ type: "text", text: JSON.stringify(res.result, null, 2) }] };
|
|
437
|
+
} catch (err) {
|
|
438
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
);
|
|
442
|
+
function postToSocket(path, body) {
|
|
443
|
+
return new Promise((resolve, reject) => {
|
|
444
|
+
const data = JSON.stringify(body);
|
|
445
|
+
const options = {
|
|
446
|
+
socketPath,
|
|
447
|
+
path,
|
|
448
|
+
method: "POST",
|
|
449
|
+
headers: {
|
|
450
|
+
"Content-Type": "application/json",
|
|
451
|
+
"Content-Length": Buffer.byteLength(data)
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
const req = http.request(options, (res) => {
|
|
455
|
+
const chunks = [];
|
|
456
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
457
|
+
res.on("end", () => {
|
|
458
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
459
|
+
try {
|
|
460
|
+
const parsed = JSON.parse(raw);
|
|
461
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
462
|
+
resolve(parsed);
|
|
463
|
+
} else {
|
|
464
|
+
reject(new Error(parsed.error || `HTTP ${res.statusCode}: ${raw}`));
|
|
465
|
+
}
|
|
466
|
+
} catch {
|
|
467
|
+
reject(new Error(`Invalid response (${res.statusCode}): ${raw}`));
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
req.on("error", (err) => {
|
|
472
|
+
reject(new Error(`Socket request failed: ${err.message}`));
|
|
473
|
+
});
|
|
474
|
+
req.write(data);
|
|
475
|
+
req.end();
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
async function main() {
|
|
479
|
+
const transport = new StdioServerTransport();
|
|
480
|
+
await server.connect(transport);
|
|
481
|
+
}
|
|
482
|
+
main().catch(console.error);
|