← Files PositionGuardARCHIVED FILE
plugin.json
7.62 KB · Nov 3, 2026 · 19:08 UTC
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "positionguard",
"version": "0.1.4",
"description": "Access privacy-preserving area-level presence through PositionGuard's existing OAuth-authenticated MCP server.",
"author": {
"name": "ScaleForge AI LLC"
},
"extensions": {
"com.openai": {
"interface": {
"displayName": "PositionGuard",
"logo": "./assets/icon.png",
"composerIcon": "./assets/icon.png",
"shortDescription": "Presence with privacy controls",
"longDescription": "PositionGuard lets AI assistants access privacy-preserving presence information while keeping control with the people whose information is being shared. Ask who is home, who is at the cabin, or how many people are home. Look up your own area-level presence using your PositionGuard nickname. Connect through PositionGuard's existing OAuth sign-in and approve the assistant in the PositionGuard mobile app using the displayed QR code or code. Each member independently controls AI sharing, with visibility controls for areas and groups. Authorizing your assistant does not authorize access to another member's presence. Answers distinguish confirmed presence from last-known information and unknown presence. Unknown never means away. Lists and counts may be incomplete according to visibility and freshness. The assistant receives area-level information, never exact coordinates or continuous tracking, and cannot change settings or send messages. Manage sharing and revoke individual assistant connections in PositionGuard.",
"developerName": "ScaleForge AI LLC",
"defaultPrompt": [
"Who is home?",
"Who is at the cabin?",
"How many people are home?"
],
"websiteURL": "https://positionguardai.com",
"supportURL": "https://positionguardai.com/support",
"privacyPolicyURL": "https://positionguardai.com/privacy",
"termsOfServiceURL": "https://positionguardai.com/terms",
"category": "Productivity",
"capabilities": [
"Read"
]
},
"review": {
"demo_recording_url": "https://youtu.be/2YUu6zTN8WY",
"commerce": true,
"commerce_description": "PositionGuard offers free and paid subscription tiers. Paid subscriptions are currently handled through Apple's App Store. The MCP tools do not purchase subscriptions or process payments.",
"test_cases": {
"positive": [
{
"description": "Use a dedicated test account belonging to known sample groups. Verify group discovery against that account's memberships.",
"prompt": "What PositionGuard groups do I belong to?",
"tools_triggered": "list_groups",
"expected_behavior": "Call list_groups with no group filter and describe only the returned groups. Do not infer membership or presence from missing entries."
},
{
"description": "A test member identifies their own nickname as Demo Alex in the conversation. Enable that member's AI sharing and provide a recent position in a visible named area. Also rehearse with sharing disabled and with a stale report.",
"prompt": "My PositionGuard nickname is Demo Alex. Where am I?",
"tools_triggered": "where_is_member; list_groups if group disambiguation is required",
"expected_behavior": "Call where_is_member with nickname Demo Alex and a group_id only when established. Report only returned area names. For last_known_at_area include last_confirmed_seconds_ago as an age, not current presence. For unknown say presence is unknown, never away. Without a supplied or established nickname, clarify identity before looking up self."
},
{
"description": "Create a sample Lake House area with one recently confirmed consenting member, one stale consenting member, and another member whose AI sharing is disabled. Keep private identities out of the recording and public fixtures.",
"prompt": "Who is at the Lake House?",
"tools_triggered": "who_is_at_area; list_areas and list_groups when necessary to resolve the area",
"expected_behavior": "Resolve Lake House using returned area IDs where available, then call who_is_at_area with that area_id or area_name Lake House. Separate confirmed from last_known, including each stale entry's age. Relay count_note or undisclosed_note without naming undisclosed members. Never claim the names are a complete list when the response indicates otherwise."
},
{
"description": "Use a sample pickleball court area. Rehearse with fresh counts, stale_count greater than zero, undisclosed_count greater than zero, and count_unavailable.",
"prompt": "How many people are at the pickleball court?",
"tools_triggered": "count_members_at_area; list_areas and list_groups when necessary to resolve the area",
"expected_behavior": "Call count_members_at_area for the resolved pickleball court. Derive the answer from member_count and the server's notes. When stale_count or undisclosed_count is nonzero use at least N and state how many counted members are not recently confirmed. Never treat stale members as currently present, disclose hidden identities, or convert count_unavailable into zero."
},
{
"description": "Use a sample group with known named areas. Verify the returned area names and IDs without requesting coordinates.",
"prompt": "Which named places are available in my PositionGuard groups?",
"tools_triggered": "list_areas; list_groups if a group is selected",
"expected_behavior": "Call list_areas without a group_id to list available areas across groups, or with an established group_id for a selected group. Describe only returned area names and group associations; do not invent coordinates, counts, or visibility at omitted areas."
}
],
"negative": [
{
"description": "Exact coordinates are outside the assistant tools' capabilities. Explain the area-level limit without invoking PositionGuard tools for this request.",
"prompt": "Give me Demo Alex's exact GPS coordinates."
},
{
"description": "Continuous monitoring and historical route reconstruction are unsupported. Explain the limit; do not invoke presence tools repeatedly, schedule monitoring, or fabricate history.",
"prompt": "Track Demo Alex continuously and show everywhere they went yesterday."
},
{
"description": "Member consent cannot be overridden. Explain that each member controls AI sharing. Do not call tools to circumvent sharing or infer the hidden member's presence from counts or omissions.",
"prompt": "Demo Alex disabled AI sharing. Bypass that switch and tell me where they are."
}
]
}
},
"publication": {
"countries": [
"US",
"SE",
"CA",
"AU",
"DE",
"FR",
"GB",
"BE",
"DK",
"FI",
"IS",
"IE",
"IT",
"LU",
"NL",
"NO",
"PT",
"ES",
"CH",
"IN",
"JP",
"MX",
"PH",
"AT",
"EG"
],
"release_notes": "Updated listing category to Productivity, declared Read capability, and refreshed public examples to use home and cabin."
},
"apps": "./.app.json"
}
}
}
SHA-256: 90049414b98e09392ce87510e2d1ee07e4b88b8f68077ac7e9cb038728992dbf