@josephyan/qingflow-app-user-mcp 0.2.0-beta.39 → 0.2.0-beta.40

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 CHANGED
@@ -3,13 +3,13 @@
3
3
  Install:
4
4
 
5
5
  ```bash
6
- npm install @josephyan/qingflow-app-user-mcp@0.2.0-beta.39
6
+ npm install @josephyan/qingflow-app-user-mcp@0.2.0-beta.40
7
7
  ```
8
8
 
9
9
  Run:
10
10
 
11
11
  ```bash
12
- npx -y -p @josephyan/qingflow-app-user-mcp@0.2.0-beta.39 qingflow-app-user-mcp
12
+ npx -y -p @josephyan/qingflow-app-user-mcp@0.2.0-beta.40 qingflow-app-user-mcp
13
13
  ```
14
14
 
15
15
  Environment:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@josephyan/qingflow-app-user-mcp",
3
- "version": "0.2.0-beta.39",
3
+ "version": "0.2.0-beta.40",
4
4
  "description": "Operational end-user MCP for Qingflow records, tasks, comments, and directory workflows.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "qingflow-mcp"
7
- version = "0.2.0b39"
7
+ version = "0.2.0b40"
8
8
  description = "User-authenticated MCP server for Qingflow"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -110,15 +110,17 @@ The DSL is clause-shaped like SQL, but it is **not raw SQL text**.
110
110
  - Do not use free-form `WHERE` updates or deletes
111
111
  - Do not auto-fill missing fields
112
112
  - Do not auto-resolve relation targets without first querying them
113
- - Do not assume member display names resolve automatically; `record_member_candidates` returns ids, but direct name-to-id write is not automatic
114
- - Do not assume department names resolve automatically; `record_department_candidates` returns ids, but direct name-to-id write is not automatic
113
+ - Do not assume member display names resolve automatically; `record_member_candidates` returns the current field candidate scope, and write paths now reject member values outside that scope when it is supported
114
+ - Do not assume department names resolve automatically; `record_department_candidates` returns the current field candidate scope, and write paths now reject department values outside that scope when it is supported
115
115
  - For default-all member or department fields, prefer the field candidate tools; do not start with `directory_*`
116
+ - Do not invent member or department ids/names when a candidate tool is available; choose an exact returned candidate item
117
+ - If member or department candidate lookup fails, stop and surface the lookup error; do not retry the write with guessed ids or names
116
118
  - Do not assume `record_schema_get` is a builder/full-field schema.
117
119
 
118
120
  ### Complex field quick examples
119
121
 
120
- - `member`: `✅ {"field_id":5,"value":{"id":7}}` / `❌ {"field_id":5,"value":"张三"}`
121
- - `department`: `✅ {"field_id":22,"value":{"id":336193,"value":"北斗组"}}` / `❌ {"field_id":22,"value":"北斗组"}`
122
+ - `member`: `✅ {"field_id":5,"value":{"id":7,"value":"张三"}}` / `✅ {"field_id":5,"value":"张三"}` only when it exactly matches a current candidate / `❌ {"field_id":5,"value":"不存在的成员"}`
123
+ - `department`: `✅ {"field_id":22,"value":{"id":336193,"value":"北斗组"}}` / `✅ {"field_id":22,"value":"北斗组"}` only when it exactly matches a current candidate / `❌ {"field_id":22,"value":"不存在的部门"}`
122
124
  - `relation`: `✅ {"field_id":25,"value":{"apply_id":5001}}` / `❌ {"field_id":25,"value":"客户A"}`
123
125
  - `attachment`: upload first, then `✅ {"field_id":13,"value":{"value":"https://.../a.pdf","name":"a.pdf"}}` / `❌ {"field_id":13,"value":"/tmp/a.pdf"}`
124
126
 
@@ -2,4 +2,4 @@ from __future__ import annotations
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.2.0b39"
5
+ __version__ = "0.2.0b40"
@@ -794,6 +794,25 @@ class AppFlowReadResponse(StrictModel):
794
794
  transitions: list[dict[str, Any]] = Field(default_factory=list)
795
795
 
796
796
 
797
+ class AppChartsReadResponse(StrictModel):
798
+ app_key: str
799
+ charts: list[dict[str, Any]] = Field(default_factory=list)
800
+ chart_count: int = 0
801
+
802
+
803
+ class PortalReadSummaryResponse(StrictModel):
804
+ dash_key: str
805
+ being_draft: bool = True
806
+ dash_name: str | None = None
807
+ package_tag_ids: list[int] = Field(default_factory=list)
808
+ dash_icon: str | None = None
809
+ hide_copyright: bool | None = None
810
+ config_keys: list[str] = Field(default_factory=list)
811
+ dash_global_config_keys: list[str] = Field(default_factory=list)
812
+ section_count: int = 0
813
+ sections: list[dict[str, Any]] = Field(default_factory=list)
814
+
815
+
797
816
  class SchemaPlanRequest(StrictModel):
798
817
  app_key: str = ""
799
818
  package_tag_id: int | None = None