From veeva-pack
Performs CRUD operations on Veeva Vault documents using Python, REST API, and VQL. For life sciences document management integrations.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin veeva-packThis skill is limited to using the following tools:
Create, retrieve, and query documents in Veeva Vault -- the fundamental CRUD operations. Uses the Vault REST API with VQL (Vault Query Language) for data retrieval.
Guides Veeva Vault deployments with REST API, VQL queries, and VAPIL Java SDK for document management, CRM, and clinical operations.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Create, retrieve, and query documents in Veeva Vault -- the fundamental CRUD operations. Uses the Vault REST API with VQL (Vault Query Language) for data retrieval.
import requests, os
vault_url = "https://myvault.veevavault.com/api/v24.1"
headers = {"Authorization": session_id}
# VQL is SQL-like but Vault-specific
query = "SELECT id, name__v, type__v, status__v, created_date__v FROM documents LIMIT 10"
response = requests.post(f"{vault_url}/query", headers=headers, data={"q": query})
result = response.json()
for doc in result.get("data", []):
print(f"{doc['name__v']} | Type: {doc['type__v']} | Status: {doc['status__v']}")
doc_id = 123
response = requests.get(f"{vault_url}/objects/documents/{doc_id}", headers=headers)
doc = response.json()
print(f"Document: {doc['document']['name__v']}")
print(f"Version: {doc['document']['major_version_number__v']}.{doc['document']['minor_version_number__v']}")
# Create document metadata
doc_data = {
"name__v": "Protocol Amendment 001",
"type__v": "Trial Document",
"subtype__v": "Protocol",
"lifecycle__v": "General Lifecycle",
}
response = requests.post(f"{vault_url}/objects/documents", headers=headers, data=doc_data)
new_id = response.json()["id"]
print(f"Created document: {new_id}")
with open("protocol.pdf", "rb") as f:
response = requests.post(
f"{vault_url}/objects/documents/{new_id}/file",
headers={**headers, "Content-Type": "application/octet-stream"},
data=f,
)
print(f"File uploaded: {response.json()['responseStatus']}")
Protocol Amendment 001 | Type: Trial Document | Status: Draft
Document: Protocol Amendment 001
Version: 0.1
Created document: 456
File uploaded: SUCCESS
| Error | Cause | Solution |
|---|---|---|
INVALID_DATA in VQL | Wrong field name | Check object metadata |
PARAMETER_REQUIRED | Missing required field | Add type__v, lifecycle__v |
OPERATION_NOT_ALLOWED | Wrong document state | Check lifecycle state |
Proceed to veeva-local-dev-loop for development workflow.